- 修复 IncludeMany 变异 Where + ToList dto 无法级联;

This commit is contained in:
2881099 2023-10-19 15:36:48 +08:00
parent 801ba148d6
commit c8bdd5e741
4 changed files with 28 additions and 113 deletions

View File

@ -1084,82 +1084,6 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder">
<summary>
动态创建实体类型
</summary>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.#ctor(IFreeSql,System.String,System.Attribute[])">
<summary>
配置Class
</summary>
<param name="className">类名</param>
<param name="attributes">类标记的特性[Table(Name = "xxx")] [Index(xxxx)]</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Boolean,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="isOverride">该属性是否重写父类属性</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Boolean,System.Object,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="isOverride">该属性是否重写父类属性</param>
<param name="defaultValue">属性默认值</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Extend(System.Type)">
<summary>
配置父类
</summary>
<param name="superClass">父类类型</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.OverrideProperty(System.Reflection.Emit.TypeBuilder@,System.Reflection.Emit.MethodBuilder,FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.PropertyMethodEnum,System.String)">
<summary>
Override属性
</summary>
<param name="typeBuilder"></param>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Build">
<summary>
Emit动态创建出Class - Type
</summary>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToLower(System.String)">
<summary>
首字母小写
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToUpper(System.String)">
<summary>
首字母大写
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)"> <member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)">
<summary> <summary>
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
@ -5842,28 +5766,6 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据 请使用 fsql.InsertDict(dict) 方法插入字典数据
</summary> </summary>
</member> </member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.DynamicEntity(FreeSql.ICodeFirst,System.String,System.Attribute[])">
<summary>
动态构建Class Type
</summary>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateInstance(FreeSql.Internal.Model.TableInfo,System.Collections.Generic.Dictionary{System.String,System.Object})">
<summary>
根据字典,创建 table 对应的实体对象
</summary>
<param name="table"></param>
<param name="dict"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateDictionary(FreeSql.Internal.Model.TableInfo,System.Object)">
<summary>
根据实体对象,创建 table 对应的字典
</summary>
<param name="table"></param>
<param name="instance"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExpressionCallExtensions.Between(System.DateTime,System.DateTime,System.DateTime)"> <member name="M:FreeSqlGlobalExpressionCallExtensions.Between(System.DateTime,System.DateTime,System.DateTime)">
<summary> <summary>
C# that >= between &amp;&amp; that &lt;= and<para></para> C# that >= between &amp;&amp; that &lt;= and<para></para>

View File

@ -40,7 +40,7 @@ namespace FreeSql.Internal.CommonProvider
#else #else
public List<Func<object, CancellationToken, Task>> _includeToListAsync = new List<Func<object, CancellationToken, Task>>(); public List<Func<object, CancellationToken, Task>> _includeToListAsync = new List<Func<object, CancellationToken, Task>>();
#endif #endif
public Dictionary<string, MemberExpression[]> _includeInfo = new Dictionary<string, MemberExpression[]>(); public Dictionary<string, NativeTuple<MemberExpression[], TableRef>> _includeInfo = new Dictionary<string, NativeTuple<MemberExpression[], TableRef>>();
public bool _distinct; public bool _distinct;
public Expression _selectExpression; public Expression _selectExpression;
public List<GlobalFilter.Item> _whereGlobalFilter; public List<GlobalFilter.Item> _whereGlobalFilter;

View File

@ -287,6 +287,7 @@ namespace FreeSql.Internal.CommonProvider
public Dictionary<string, IncludeManyNewInit> Childs { get; } = new Dictionary<string, IncludeManyNewInit>(); public Dictionary<string, IncludeManyNewInit> Childs { get; } = new Dictionary<string, IncludeManyNewInit>();
public Expression CurrentExpression { get; } public Expression CurrentExpression { get; }
public bool IsOutputPrimary { get; set; } public bool IsOutputPrimary { get; set; }
public List<ColumnInfo> OutputColumns { get; } = new List<ColumnInfo>();
public IncludeManyNewInit(TableInfo table, Expression currentExpression) public IncludeManyNewInit(TableInfo table, Expression currentExpression)
{ {
this.Table = table; this.Table = table;
@ -313,20 +314,26 @@ namespace FreeSql.Internal.CommonProvider
{ {
var curIncNewInit = incNewInit; var curIncNewInit = incNewInit;
Expression curParmExp = parmExp; Expression curParmExp = parmExp;
for (var a = 0; a < inc.Value.Length - 1; a++) for (var a = 0; a < inc.Value.Item1.Length - 1; a++)
{ {
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member);
if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false)
curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp));
else else
curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name];
} }
curIncNewInit.IsOutputPrimary = true; curIncNewInit.IsOutputPrimary = true;
var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray();
if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols);
} }
MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni)
{ {
var bindings = new List<MemberBinding>(); var bindings = new List<MemberBinding>();
if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); if (imni.IsOutputPrimary)
{
bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
}
if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value))));
var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr =>
{ {
@ -1514,7 +1521,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < members.Count; a++) includeValue[a] = members[a]; for (var a = 0; a < members.Count; a++) includeValue[a] = members[a];
includeValue[includeValue.Length - 1] = expBody as MemberExpression; includeValue[includeValue.Length - 1] = expBody as MemberExpression;
var includeKey = $"{string.Join(".", includeValue.Select(a => a.Member.Name))}"; var includeKey = $"{string.Join(".", includeValue.Select(a => a.Member.Name))}";
if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, includeValue); if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, NativeTuple.Create(includeValue, tbref));
return this; return this;
} }
@ -1577,20 +1584,26 @@ namespace FreeSql.Internal.CommonProvider
{ {
var curIncNewInit = incNewInit; var curIncNewInit = incNewInit;
Expression curParmExp = parmExp; Expression curParmExp = parmExp;
for (var a = 0; a < inc.Value.Length - 1; a++) for (var a = 0; a < inc.Value.Item1.Length - 1; a++)
{ {
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member);
if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false)
curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp));
else else
curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name];
} }
curIncNewInit.IsOutputPrimary = true; curIncNewInit.IsOutputPrimary = true;
var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray();
if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols);
} }
MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni)
{ {
var bindings = new List<MemberBinding>(); var bindings = new List<MemberBinding>();
if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); if (imni.IsOutputPrimary)
{
bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
}
if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value))));
var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr =>
{ {

View File

@ -129,7 +129,7 @@ namespace FreeSql.Xugu
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}";
} }
public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2);
public override string QuoteParamterName(string name) => $"@{name}"; public override string QuoteParamterName(string name) => $":{name}";
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";