模型查询接口增加按子表字段查询

This commit is contained in:
2023-11-02 17:42:12 +08:00
parent 29eb552d3b
commit 5dbbe60682
7 changed files with 205 additions and 49 deletions

View File

@@ -1,6 +1,8 @@
using System.Collections.Concurrent;
using System.Security.Cryptography.Xml;
using JNPF;
using JNPF.Common.Core.Manager;
using JNPF.Common.Extension;
using JNPF.DependencyInjection;
using Microsoft.Extensions.Configuration;
using SqlSugar;
@@ -15,7 +17,7 @@ namespace Tnb.Vengine.DataAccess;
public class DataAccess : IDataAccess, ITransient, IDisposable
{
private const int MAX_PAGE_SIZE = 1000;
private ISqlSugarClient? _db;
private static ISqlSugarClient? _db;
protected ISqlSugarClient Db
{
@@ -170,14 +172,18 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
private async Task LoadVmodelNavigateAsync(Vmodel vm)
{
Dictionary<string, Vmodel> dictVm = new();
var vmids = vm.navProps.Select(a => a.vmid).Distinct().ToList();
var ls = await Db.Queryable<Vmodel>().Where(a => vmids.Contains(a.id)).ToListAsync();
var navs = ls.ToDictionary(a => a.id);
foreach (var navProp in vm.navProps)
{
if (!dictVm.ContainsKey(navProp.vmid))
{
var navModel = await GetVmodelAsync(navProp.vmid);
dictVm.Add(navProp.vmid, navModel);
}
navProp.naviModel = dictVm[navProp.vmid];
navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid);
//if (!dictVm.ContainsKey(navProp.vmid))
//{
// var navModel = await GetVmodelAsync(navProp.vmid);
// dictVm.Add(navProp.vmid, navModel);
//}
//navProp.naviModel = dictVm[navProp.vmid];
}
}
@@ -191,10 +197,8 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
var selProps = vm.GetVmSelectProps(input.o);
//处理导航属性联表
List<JoinInfoParameter> joins = vm.GetJoinInfos(selProps);
query.AddJoinInfo(joins);
//if (joins.Count > 0)
//{
//}
query.AddJoinInfo(joins);
List<IConditionalModel> wheres = vm.GetConditionalModels(input.q);
if (!string.IsNullOrEmpty(input.k))
{
@@ -208,10 +212,8 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
wheres.Add(new ConditionalCollections() { ConditionalList = lsCondition });
}
//处理查询参数
query.Where(wheres);
//if (wheres.Count > 0)
//{
//}
query.Where(wheres);
if (!string.IsNullOrEmpty(input.sort))
{
query.OrderBy(input.sort);
@@ -229,7 +231,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
//组装输出对象
foreach (var data in ls)
{
DObject ret = await NestedOutputAsync(vm, new DObject(data), selProps);
DObject ret = await CombineOutputAsync(vm, new DObject(data), selProps);
result.items.Add(ret);
}
@@ -243,11 +245,12 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
/// <param name="src"></param>
/// <param name="selProps"></param>
/// <returns></returns>
private async Task<DObject> NestedOutputAsync(Vmodel vm, DObject src, List<VmSelectProp> selProps)
private async Task<DObject> CombineOutputAsync(Vmodel vm, DObject src, List<VmSelectProp> selProps)
{
DObject ret = new();
foreach (var prop in selProps)
{
// 加载主表字段
if (prop.navType == eNavigateType.None || prop.navCode == VmSelectProp.MAIN_ALIES)
{
if (src.ContainsKey(prop.code))
@@ -257,40 +260,14 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
}
else
{
// 加载关联表字段
if (prop.navType == eNavigateType.OneToOne)
{
//以 nav_prop的形式返回
var key = prop.navCode + "_" + prop.code;
ret.Add(key, src[key]);
//以 nav.prop的形式返回
//if (!ret.ContainsKey(prop.navCode))
//{
// ret.Add(prop.navCode, new DObject());
//}
//var key = prop.navCode + "_" + prop.code;
//if (src.ContainsKey(key))
//{
// ((DObject)ret[prop.navCode]).Add(prop.code, src[key]);
//}
NestedOutput(vm, src, ret, prop);
}
else if (prop.navType == eNavigateType.OneToMany)
{
if (!ret.ContainsKey(prop.navCode))
{
ret.Add(prop.navCode, new List<DObject>());
}
var navProp = vm.navProps.First(a => a.code == prop.navCode);
if (navProp != null && navProp.naviModel != null && src.ContainsKey(navProp.refField))
{
VmListInput input = new VmListInput();
var fkProp = navProp.naviModel.FieldCodeToPropCode(navProp.fkField);
if (!string.IsNullOrEmpty(fkProp))
{
input.q = new DObject(fkProp, src[navProp.refField]);
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code));
ret[prop.navCode] = (await QueryDataAsync(navProp.naviModel, input)).items;
}
}
await NestedOneToManyAsync(vm, src, ret, prop, selProps);
}
else if (prop.navType == eNavigateType.ManyToMany)
{
@@ -304,6 +281,50 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
return ret;
}
/// <summary>
/// 将一对一的关联表字段嵌入到返回值中
/// </summary>
private void NestedOutput(Vmodel vm, DObject src, DObject ret, VmSelectProp prop)
{
// 以 nav_prop的形式返回
var key = prop.navCode + "_" + prop.code;
ret.Add(key, src[key]);
// 以 nav.prop的形式返回
//if (!ret.ContainsKey(prop.navCode))
//{
// ret.Add(prop.navCode, new DObject());
//}
//var key = prop.navCode + "_" + prop.code;
//if (src.ContainsKey(key))
//{
// ((DObject)ret[prop.navCode]).Add(prop.code, src[key]);
//}
}
private async Task NestedOneToManyAsync(Vmodel vm, DObject src, DObject ret, VmSelectProp prop, List<VmSelectProp> selProps)
{
// 在返回值中增加导航属性
if (ret.ContainsKey(prop.navCode))
{
return;
}
ret.Add(prop.navCode, new List<DObject>());
// 找到导航属性的配置
var navCfg = vm.navProps.First(a => a.code == prop.navCode);
if (navCfg != null && navCfg.naviModel != null && src.ContainsKey(navCfg.refField) && navCfg.refCode == VmSelectProp.MAIN_ALIES)
{
VmListInput input = new VmListInput();
var fkProp = navCfg.naviModel.FieldCodeToPropCode(navCfg.fkField);
if (!string.IsNullOrEmpty(fkProp))
{
input.q = new DObject(fkProp, src[navCfg.refField]);
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code));
ret[prop.navCode] = (await QueryDataAsync(navCfg.naviModel, input)).items;
}
}
}
/// <summary>
/// 新增数据 默认方法
/// </summary>