模型通用接口List改为用left join

This commit is contained in:
2023-11-09 10:21:31 +08:00
parent 14aa0b2ff4
commit cacf974527
4 changed files with 44 additions and 32 deletions

View File

@@ -3,6 +3,9 @@
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir> <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<NoWarn>$(NoWarn);CS1570;CS1587;CS1591;CS8601;CS8602;CS8603;CS8618;</NoWarn> <NoWarn>$(NoWarn);CS1570;CS1587;CS1591;CS8601;CS8602;CS8603;CS8618;</NoWarn>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

View File

@@ -184,7 +184,10 @@ public static class StringExtensions
#endregion #endregion
public static (string, string) LastSplit(this string str, char seperate) /// <summary>
/// 查找路径的上一级
/// </summary>
public static (string?, string) LastSplitOnce(this string str, char seperate)
{ {
int n = str.LastIndexOf(seperate); int n = str.LastIndexOf(seperate);
if (n > 0) if (n > 0)
@@ -193,7 +196,8 @@ public static class StringExtensions
} }
else else
{ {
return (str, null); return (null, str);
} }
} }
} }

View File

@@ -8,52 +8,57 @@ namespace Tnb.Vengine.Domain
private readonly IDataAccess _dataAccess; private readonly IDataAccess _dataAccess;
private readonly Vmodel _root; private readonly Vmodel _root;
private List<string> _outputs; private List<string> _outputs;
private Dictionary<string, OutputSelect> _selectProps = new Dictionary<string, OutputSelect>(); private Dictionary<string, VmSelect> _selectProps = new Dictionary<string, VmSelect>();
private Dictionary<string, Vmodel?> _navModels = new Dictionary<string, Vmodel?>(); private Dictionary<string, Vmodel?> _navModels = new Dictionary<string, Vmodel?>();
public VmQueryParser(IDataAccess dataAccess, Vmodel rootModel, string output) public VmQueryParser(IDataAccess dataAccess, Vmodel rootModel, string output)
{ {
_dataAccess = dataAccess; _dataAccess = dataAccess;
_root = rootModel; _root = rootModel;
_outputs = output.Split(',').Distinct().ToList(); ParseOutputStr(output);
ParseOutputStr();
} }
/// <summary> /// <summary>
/// 按模型组织要输出的属性 /// 按模型组织要输出的属性
/// </summary> /// </summary>
private void ParseOutputStr() private void ParseOutputStr(string output)
{ {
_outputs = output.Split(',').Distinct().ToList();
_selectProps.Add(Vmodel.MAIN_ALIES, new VmSelect() { navModel = _root });
foreach (var outStr in _outputs) foreach (var outStr in _outputs)
{ {
if (string.IsNullOrWhiteSpace(outStr)) if (string.IsNullOrWhiteSpace(outStr)) continue;
var codes = outStr.Split('.');
if (codes.Length == 1)
{ {
_selectProps[Vmodel.MAIN_ALIES].propCodes.Add(outStr);
continue; continue;
} }
string vmPath; var vmPath = "";
int n = outStr.LastIndexOf('.'); for (int i = 0; i < codes.Length - 1; i++)
if (n < 1)
{ {
vmPath = Vmodel.MAIN_ALIES; vmPath = i == 0 ? codes[i] : vmPath + "." + codes[i];
if (!_selectProps.ContainsKey(vmPath))
{
_selectProps.Add(vmPath, new VmSelect(vmPath, i + 2));
}
if (i == codes.Length - 2)
{
_selectProps[vmPath].propCodes.Add(codes[i + 1]);
}
} }
else
{
vmPath = outStr.Substring(0, n);
}
if (!_selectProps.ContainsKey(vmPath))
{
_selectProps.Add(vmPath, new OutputSelect { navPaths = vmPath.Split(',').ToList(), vmPath = vmPath });
}
var outSelect = _selectProps[vmPath];
outSelect.propCodes.Add(outStr.Substring(n + 1));
} }
} }
private async Task LoadNavModel() private async Task LoadNavModel()
{ {
var keys = _selectProps.Keys.Where(a => a != Vmodel.MAIN_ALIES).OrderBy(a => a).ToList();
foreach (var selVm in _selectProps.Values) foreach (var selVm in _selectProps.Values)
{ {
//if(selVm.navModel != null) if (_navModels.ContainsKey(selVm.path))
{
continue;
}
} }
var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.path.StartsWith(a.code + "."))).ToList();
await LoadVmodelNavigateAsync(navProps); await LoadVmodelNavigateAsync(navProps);
} }
private async Task LoadVmodelNavigateAsync(List<VmNavProp> navProps) private async Task LoadVmodelNavigateAsync(List<VmNavProp> navProps)
@@ -65,30 +70,30 @@ namespace Tnb.Vengine.Domain
foreach (var navProp in navProps) foreach (var navProp in navProps)
{ {
navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid); navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid);
navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.path.StartsWith(a.code + "."))).ToList();
} }
} }
} }
internal class OutputSelect internal class VmSelect
{ {
public Vmodel? navModel { get; set; } public Vmodel? navModel { get; set; }
public string navPath { get; set; } = string.Empty; public string path { get; set; } = Vmodel.MAIN_ALIES;
public string vmPath { get; set; } = string.Empty; public int level { get; set; } = 1;
public eNavigateType navType { get; set; } = eNavigateType.None; public eNavigateType navType { get; set; } = eNavigateType.None;
public List<string> navPaths { get; set; } = new List<string>(); public List<string> navPaths { get; set; } = new List<string>();
public List<string> propCodes { get; set; } = new List<string>(); public List<string> propCodes { get; set; } = new List<string>();
public List<string> fieldCodes { get; set; } = new List<string>(); public List<string> fieldCodes { get; set; } = new List<string>();
public OutputSelect() public VmSelect()
{ {
} }
public OutputSelect(Vmodel model) public VmSelect(string vmPath, int vmLevel)
{ {
vmPath = Vmodel.MAIN_ALIES; path = vmPath;
level = vmLevel;
} }
} }

View File

@@ -332,7 +332,7 @@ public partial class Vmodel : Entity
if (navCode == VmSelectProp.MAIN_ALIES) continue; if (navCode == VmSelectProp.MAIN_ALIES) continue;
var navProp = navProps.First(a => a.code == navCode); var navProp = navProps.First(a => a.code == navCode);
if (navProp.naviModel == null || navProp.navType != eNavigateType.OneToOne) continue; if (navProp.naviModel == null || navProp.navType != eNavigateType.OneToOne) continue;
JoinInfoParameter join = new JoinInfoParameter { TableName = navProp.naviModel.tableName, ShortName = navCode, Type = JoinType.Inner }; JoinInfoParameter join = new JoinInfoParameter { TableName = navProp.naviModel.tableName, ShortName = navCode, Type = JoinType.Left };
var fkField = navProp.naviModel.PropCodeToFieldCode(navProp.fkField); var fkField = navProp.naviModel.PropCodeToFieldCode(navProp.fkField);
var refField = navProp.refField; var refField = navProp.refField;
if (navProp.refCode != VmSelectProp.MAIN_ALIES) if (navProp.refCode != VmSelectProp.MAIN_ALIES)