From e6ba6feff13a49b929a1a3b3d662c9b1ab8a0427 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Mon, 15 Aug 2022 18:29:32 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E5=AD=90=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=E5=86=85=E4=BD=BF=E7=94=A8=E5=B5=8C=E5=A5=97=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=20bug=EF=BC=9B#1215?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 -----
.../Curd/SqlServerSelectWithTempQueryTest.cs | 39 ++++++++++++++-----
FreeSql/Internal/CommonExpression.cs | 14 ++++---
README.md | 3 +-
README.zh-CN.md | 3 +-
5 files changed, 42 insertions(+), 26 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 26522f10..537315e2 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -800,14 +800,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs
index cc445e7e..165b134e 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs
@@ -34,14 +34,14 @@ namespace FreeSql.Tests.SqlServer
FROM [bhe_1] a
WHERE (a.Id IN (SELECT a.[Id] as1
FROM (
- SELECT a.[IsDeleted], a.[Id], a.[No], a.[Date], SP10b.[Quantity], isnull((SELECT sum(ti2.[Quantity])
+ SELECT a.[IsDeleted], a.[Id], a.[No], a.[Date], htb.[Quantity], isnull((SELECT sum(ti2.[Quantity])
FROM [bie_2] ti2
- WHERE (ti2.[RefHeadId] = SP10b.[HeadId] AND ti2.[RefItemId] = SP10b.[Id])), 0) [RefQuantity]
+ 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)) SP10b ON a.[Id] = SP10b.[HeadId]
+ WHERE (bi.[IsDeleted] = 0)) htb ON a.[Id] = htb.[HeadId]
WHERE (a.[IsDeleted] = 0) ) a
WHERE (a.[RefQuantity] < a.[Quantity])
GROUP BY a.[Id]))
@@ -68,14 +68,14 @@ ORDER BY a.[Date] DESC", sql1);
FROM [bhe_1] a
WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id]
FROM (
- SELECT ht1.[IsDeleted], ht1.[Id], ht1.[No], ht1.[Date], ht2.[Quantity], isnull((SELECT sum(ti2.[Quantity])
+ SELECT bh.[IsDeleted], bh.[Id], bh.[No], bh.[Date], ht2.[Quantity], isnull((SELECT sum(ti2.[Quantity])
FROM [bie_2] ti2
WHERE (ti2.[RefHeadId] = ht2.[HeadId] AND ti2.[RefItemId] = ht2.[Id])), 0) [RefQuantity]
- FROM [bhe_1] ht1
+ FROM [bhe_1] bh
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)) ht2 ON ht1.[Id] = ht2.[HeadId]
+ WHERE (bi.[IsDeleted] = 0)) ht2 ON bh.[Id] = ht2.[HeadId]
WHERE (bh.[IsDeleted] = 0) ) v
WHERE (v.[RefQuantity] < v.[Quantity]))))
ORDER BY a.[Date] DESC", sql2);
@@ -99,8 +99,8 @@ ORDER BY a.[Date] DESC", sql2);
)
.RightJoin(v => v.t1.Id == v.t2.Id)
.OrderByDescending(v => v.t1.Date)
- .ToSql();
- Assert.Equal(@"SELECT *
+ .ToSql(v => v.t1);
+ Assert.Equal(@"SELECT a.[IsDeleted] as1, a.[Id] as2, a.[No] as3, a.[Date] as4
FROM [bhe_1] a
RIGHT JOIN (
SELECT DISTINCT a.[Id]
@@ -115,7 +115,28 @@ RIGHT JOIN (
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);
+ORDER BY a.[Date] DESC", sql3);
+
+ fsql.Select().AsType(typeof(BhEntity1))
+ .FromQuery(
+ fsql.Select().AsType(typeof(BhEntity1)).Where(bh => bh.IsDeleted == false)
+ .FromQuery(fsql.Select().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().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)
+ .ToList();
}
[Fact]
diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs
index 2081e185..c347de0a 100644
--- a/FreeSql/Internal/CommonExpression.cs
+++ b/FreeSql/Internal/CommonExpression.cs
@@ -1119,6 +1119,7 @@ namespace FreeSql.Internal
Select0Provider fsqlSelect0 = null;
List fsqltables = null;
var fsqltable1SetAlias = false;
+ var fsqltable1SetAliasGai = 0;
Type fsqlType = null;
Stack asSelectBefores = new Stack();
var asSelectSql = "";
@@ -1279,16 +1280,16 @@ namespace FreeSql.Internal
if (argExpLambda.Parameters.Count == 1 && argExpLambda.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`"))
{
- for (var gai = 0; gai < fsqlTypeGenericArgs.Length; gai++)
- fsqltables[gai].Alias = "ht" + (gai + 1);
+ for (; fsqltable1SetAliasGai < fsqlTypeGenericArgs.Length; fsqltable1SetAliasGai++)
+ fsqltables[fsqltable1SetAliasGai].Alias = "ht" + (fsqltable1SetAliasGai + 1);
}
else
{
- for (var gai = 0; gai < fsqlTypeGenericArgs.Length && gai < argExpLambda.Parameters.Count; gai++)
+ for (; fsqltable1SetAliasGai < fsqlTypeGenericArgs.Length && fsqltable1SetAliasGai < argExpLambda.Parameters.Count; fsqltable1SetAliasGai++)
{
- var alias = argExpLambda.Parameters[gai].Name;
+ var alias = argExpLambda.Parameters[fsqltable1SetAliasGai].Name;
if (fsqltables.Any(x => x.Type == SelectTableInfoType.Parent && x.Alias == alias)) alias = $"sub_{alias}";
- fsqltables[gai].Alias = alias;
+ fsqltables[fsqltable1SetAliasGai].Alias = alias;
}
}
}
@@ -1317,10 +1318,11 @@ namespace FreeSql.Internal
case nameof(ISelect