Skip to content

Commit c8bdd5e

Browse files
committed
- 修复 IncludeMany 变异 Where + ToList dto 无法级联;
1 parent 801ba14 commit c8bdd5e

File tree

4 files changed

+28
-113
lines changed

4 files changed

+28
-113
lines changed

FreeSql/FreeSql.xml

Lines changed: 0 additions & 98 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public abstract partial class Select0Provider
4040
#else
4141
public List<Func<object, CancellationToken, Task>> _includeToListAsync = new List<Func<object, CancellationToken, Task>>();
4242
#endif
43-
public Dictionary<string, MemberExpression[]> _includeInfo = new Dictionary<string, MemberExpression[]>();
43+
public Dictionary<string, NativeTuple<MemberExpression[], TableRef>> _includeInfo = new Dictionary<string, NativeTuple<MemberExpression[], TableRef>>();
4444
public bool _distinct;
4545
public Expression _selectExpression;
4646
public List<GlobalFilter.Item> _whereGlobalFilter;

FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ class IncludeManyNewInit
287287
public Dictionary<string, IncludeManyNewInit> Childs { get; } = new Dictionary<string, IncludeManyNewInit>();
288288
public Expression CurrentExpression { get; }
289289
public bool IsOutputPrimary { get; set; }
290+
public List<ColumnInfo> OutputColumns { get; } = new List<ColumnInfo>();
290291
public IncludeManyNewInit(TableInfo table, Expression currentExpression)
291292
{
292293
this.Table = table;
@@ -313,20 +314,26 @@ public List<TReturn> ToList<TReturn>(Expression<Func<T1, TReturn>> select)
313314
{
314315
var curIncNewInit = incNewInit;
315316
Expression curParmExp = parmExp;
316-
for (var a = 0; a < inc.Value.Length - 1; a++)
317+
for (var a = 0; a < inc.Value.Item1.Length - 1; a++)
317318
{
318-
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member);
319-
if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false)
320-
curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp));
319+
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member);
320+
if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false)
321+
curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp));
321322
else
322-
curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name];
323+
curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name];
323324
}
324325
curIncNewInit.IsOutputPrimary = true;
326+
var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray();
327+
if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols);
325328
}
326329
MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni)
327330
{
328331
var bindings = new List<MemberBinding>();
329-
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]))));
332+
if (imni.IsOutputPrimary)
333+
{
334+
bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
335+
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]))));
336+
}
330337
if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value))));
331338
var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr =>
332339
{
@@ -1514,7 +1521,7 @@ public ISelect<T1> IncludeMany<TNavigate>(Expression<Func<T1, IEnumerable<TNavig
15141521
for (var a = 0; a < members.Count; a++) includeValue[a] = members[a];
15151522
includeValue[includeValue.Length - 1] = expBody as MemberExpression;
15161523
var includeKey = $"{string.Join(".", includeValue.Select(a => a.Member.Name))}";
1517-
if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, includeValue);
1524+
if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, NativeTuple.Create(includeValue, tbref));
15181525
return this;
15191526
}
15201527

@@ -1577,20 +1584,26 @@ async public Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, TRetur
15771584
{
15781585
var curIncNewInit = incNewInit;
15791586
Expression curParmExp = parmExp;
1580-
for (var a = 0; a < inc.Value.Length - 1; a++)
1587+
for (var a = 0; a < inc.Value.Item1.Length - 1; a++)
15811588
{
1582-
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member);
1583-
if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false)
1584-
curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp));
1589+
curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member);
1590+
if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false)
1591+
curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp));
15851592
else
1586-
curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name];
1593+
curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name];
15871594
}
15881595
curIncNewInit.IsOutputPrimary = true;
1596+
var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray();
1597+
if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols);
15891598
}
15901599
MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni)
15911600
{
15921601
var bindings = new List<MemberBinding>();
1593-
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]))));
1602+
if (imni.IsOutputPrimary)
1603+
{
1604+
bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName]))));
1605+
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]))));
1606+
}
15941607
if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value))));
15951608
var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr =>
15961609
{

Providers/FreeSql.Provider.Xugu/XuguUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public override string TrimQuoteSqlName(string name)
129129
return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}";
130130
}
131131
public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2);
132-
public override string QuoteParamterName(string name) => $"@{name}";
132+
public override string QuoteParamterName(string name) => $":{name}";
133133
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
134134
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
135135
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";

0 commit comments

Comments
 (0)