mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 修复 IncludeMany 变异 Where + ToList dto 无法级联;
This commit is contained in:
parent
801ba148d6
commit
c8bdd5e741
@ -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 && that <= and<para></para>
|
C#: that >= between && that <= and<para></para>
|
||||||
|
@ -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;
|
||||||
|
@ -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 =>
|
||||||
{
|
{
|
||||||
|
@ -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}";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user