mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 修复 子查询内使用嵌套查询的 bug;
This commit is contained in:
parent
e5b10704cc
commit
e68806a3b2
@ -71,7 +71,7 @@ WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id]
|
|||||||
SELECT ht1.[IsDeleted], ht1.[Id], ht1.[No], ht1.[Date], ht2.[Quantity], isnull((SELECT sum(ti2.[Quantity])
|
SELECT ht1.[IsDeleted], ht1.[Id], ht1.[No], ht1.[Date], ht2.[Quantity], isnull((SELECT sum(ti2.[Quantity])
|
||||||
FROM [bie_2] ti2
|
FROM [bie_2] ti2
|
||||||
WHERE (ti2.[RefHeadId] = ht2.[HeadId] AND ti2.[RefItemId] = ht2.[Id])), 0) [RefQuantity]
|
WHERE (ti2.[RefHeadId] = ht2.[HeadId] AND ti2.[RefItemId] = ht2.[Id])), 0) [RefQuantity]
|
||||||
FROM [BaseHeadEntity] ht1
|
FROM [bhe_1] ht1
|
||||||
INNER JOIN (
|
INNER JOIN (
|
||||||
SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId]
|
SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId]
|
||||||
FROM [bie_1] bi
|
FROM [bie_1] bi
|
||||||
@ -79,6 +79,43 @@ WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id]
|
|||||||
WHERE (bh.[IsDeleted] = 0) ) v
|
WHERE (bh.[IsDeleted] = 0) ) v
|
||||||
WHERE (v.[RefQuantity] < v.[Quantity]))))
|
WHERE (v.[RefQuantity] < v.[Quantity]))))
|
||||||
ORDER BY a.[Date] DESC", sql2);
|
ORDER BY a.[Date] DESC", sql2);
|
||||||
|
|
||||||
|
var sql3 = fsql.Select<BaseHeadEntity>().AsType(typeof(BhEntity1))
|
||||||
|
.FromQuery(
|
||||||
|
fsql.Select<BaseHeadEntity>().AsType(typeof(BhEntity1)).Where(bh => bh.IsDeleted == false)
|
||||||
|
.FromQuery(fsql.Select<BaseItemEntity>().AsType(typeof(BiEntity1)).As("bi").Where(bi => bi.IsDeleted == false))
|
||||||
|
.InnerJoin(v => v.t1.Id == v.t2.HeadId)
|
||||||
|
.WithTempQuery(v => new
|
||||||
|
{
|
||||||
|
BillHead = v.t1,
|
||||||
|
Quantity = v.t2.Quantity,
|
||||||
|
RefQuantity = fsql.Select<BaseItemEntity>().AsType(typeof(BiEntity2)).As("bi2")
|
||||||
|
.Where(ti2 => ti2.RefHeadId == v.t2.HeadId && ti2.RefItemId == v.t2.Id)
|
||||||
|
.Sum(ti2 => ti2.Quantity),
|
||||||
|
})
|
||||||
|
.Where(v => v.RefQuantity < v.Quantity)
|
||||||
|
.Distinct()
|
||||||
|
.WithTempQuery(v => new { v.BillHead.Id })
|
||||||
|
)
|
||||||
|
.RightJoin(v => v.t1.Id == v.t2.Id)
|
||||||
|
.OrderByDescending(v => v.t1.Date)
|
||||||
|
.ToSql();
|
||||||
|
Assert.Equal(@"SELECT *
|
||||||
|
FROM [bhe_1] a
|
||||||
|
RIGHT JOIN (
|
||||||
|
SELECT DISTINCT a.[Id]
|
||||||
|
FROM (
|
||||||
|
SELECT a.[IsDeleted], a.[Id], a.[No], a.[Date], htb.[Quantity], isnull((SELECT sum(ti2.[Quantity])
|
||||||
|
FROM [bie_2] ti2
|
||||||
|
WHERE (ti2.[RefHeadId] = htb.[HeadId] AND ti2.[RefItemId] = htb.[Id])), 0) [RefQuantity]
|
||||||
|
FROM [bhe_1] a
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId]
|
||||||
|
FROM [bie_1] bi
|
||||||
|
WHERE (bi.[IsDeleted] = 0)) htb ON a.[Id] = htb.[HeadId]
|
||||||
|
WHERE (a.[IsDeleted] = 0) ) a
|
||||||
|
WHERE (a.[RefQuantity] < a.[Quantity]) ) htb ON a.[Id] = htb.[Id]
|
||||||
|
ORDER BY a.[Date] DESC;", sql3);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
@ -1083,13 +1083,6 @@ namespace FreeSql.Internal
|
|||||||
case "Min": return $"min({ExpressionLambdaToSql(exp3.Arguments[0], tsc)})";
|
case "Min": return $"min({ExpressionLambdaToSql(exp3.Arguments[0], tsc)})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (callType.FullName.StartsWith("FreeSql.ISelectGrouping`"))
|
|
||||||
{
|
|
||||||
switch (exp3.Method.Name)
|
|
||||||
{
|
|
||||||
case "ToList": return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (callType.FullName.StartsWith("FreeSql.ISelect`"))
|
if (callType.FullName.StartsWith("FreeSql.ISelect`"))
|
||||||
{ //子表查询
|
{ //子表查询
|
||||||
switch (exp3.Method.Name)
|
switch (exp3.Method.Name)
|
||||||
@ -2268,7 +2261,9 @@ namespace FreeSql.Internal
|
|||||||
public LambdaExpression Modify(LambdaExpression lambda, List<SelectTableInfo> tables)
|
public LambdaExpression Modify(LambdaExpression lambda, List<SelectTableInfo> tables)
|
||||||
{
|
{
|
||||||
this.tables = tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList();
|
this.tables = tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList();
|
||||||
parameters = this.tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray();
|
parameters = this.tables.Select(a => a.Parameter ??
|
||||||
|
Expression.Parameter(a.Table.Type,
|
||||||
|
a.Alias.StartsWith("SP10") ? a.Alias.Replace("SP10", "ht") : a.Alias)).ToArray();
|
||||||
var exp = Visit(lambda.Body);
|
var exp = Visit(lambda.Body);
|
||||||
return Expression.Lambda(exp, parameters);
|
return Expression.Lambda(exp, parameters);
|
||||||
}
|
}
|
||||||
@ -2282,13 +2277,21 @@ namespace FreeSql.Internal
|
|||||||
if (parent.Expression?.NodeType == ExpressionType.Parameter &&
|
if (parent.Expression?.NodeType == ExpressionType.Parameter &&
|
||||||
parent.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
|
parent.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
|
||||||
int.TryParse(parent.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
|
int.TryParse(parent.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
|
||||||
|
{
|
||||||
|
if (parameters[widx - 1].Type != parent.Type) //解决 BaseEntity + AsTable 时报错
|
||||||
|
parameters[widx - 1] = Expression.Parameter(parent.Type, parameters[widx - 1].Name);
|
||||||
return Expression.Property(parameters[widx - 1], node.Member.Name);
|
return Expression.Property(parameters[widx - 1], node.Member.Name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.Expression?.NodeType == ExpressionType.Parameter &&
|
if (node.Expression?.NodeType == ExpressionType.Parameter &&
|
||||||
node.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
|
node.Expression.Type.Name.StartsWith("HzyTuple`") == true &&
|
||||||
int.TryParse(node.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
|
int.TryParse(node.Member.Name.Replace("t", ""), out widx) && widx > 0 && widx <= tables.Count)
|
||||||
|
{
|
||||||
|
if (parameters[widx - 1].Type != node.Type) //解决 BaseEntity + AsTable 时报错
|
||||||
|
parameters[widx - 1] = Expression.Parameter(node.Type, parameters[widx - 1].Name);
|
||||||
return parameters[widx - 1];
|
return parameters[widx - 1];
|
||||||
|
}
|
||||||
|
|
||||||
return base.VisitMember(node);
|
return base.VisitMember(node);
|
||||||
}
|
}
|
||||||
|
@ -93,23 +93,18 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
|
|
||||||
if (lambParms == null)
|
if (lambParms == null)
|
||||||
{
|
{
|
||||||
var fromTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList();
|
var fromParentTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList();
|
||||||
if (fromTables.Count > 0)
|
var fromTables = fromParentTables.Any() ? from._tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList() : from._tables;
|
||||||
{
|
if (to._tables.Count <= fromTables.Count)
|
||||||
to._tables = new List<SelectTableInfo>(to._tables);
|
to._tables = new List<SelectTableInfo>(fromTables);
|
||||||
to._tables.AddRange(fromTables);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (to._tables.Count <= from._tables.Count)
|
to._tables = new List<SelectTableInfo>(to._tables);
|
||||||
to._tables = new List<SelectTableInfo>(from._tables.ToArray());
|
for (var a = 0; a < fromTables.Count; a++)
|
||||||
else
|
to._tables[a] = fromTables[a];
|
||||||
{
|
|
||||||
to._tables = new List<SelectTableInfo>(to._tables);
|
|
||||||
for (var a = 0; a < from._tables.Count; a++)
|
|
||||||
to._tables[a] = from._tables[a];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (fromParentTables.Any())
|
||||||
|
to._tables.AddRange(fromParentTables);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user