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.WithTempQuery): fsql = method.Invoke(fsql, args); fsqlType = fsql.GetType(); - fsqlSelect0 = fsql as Select0Provider; + fsqlSelect0 = fsql as Select0Provider; if (tsc.dbParams != null) fsqlSelect0._params = tsc.dbParams; fsqltables = fsqlSelect0._tables; fsqltable1SetAlias = false; + if (method.Name == nameof(ISelect.WithTempQuery)) fsqltable1SetAliasGai = 0; break; default: method.Invoke(fsql, args); diff --git a/README.md b/README.md index 10361320..1f622da5 100644 --- a/README.md +++ b/README.md @@ -207,7 +207,8 @@ And other friends who made important suggestions for this project, they include: [feijie999](https://github.com/feijie999), constantine, [JohnZhou2020](https://github.com/JohnZhou2020), -[mafeng8](https://github.com/mafeng8), etc. +[mafeng8](https://github.com/mafeng8), +[VicBilibily](https://github.com/VicBilibily), etc. ## 💕 Donation diff --git a/README.zh-CN.md b/README.zh-CN.md index d112ea24..38d7321e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -210,7 +210,8 @@ Elapsed: 00:00:00.6495301; Query Entity Counts: 131072; ORM: Dapper [feijie999](https://github.com/feijie999), constantine, [JohnZhou2020](https://github.com/JohnZhou2020), -[mafeng8](https://github.com/mafeng8) 等。 +[mafeng8](https://github.com/mafeng8), +[VicBilibily](https://github.com/VicBilibily) 等。 ## 💕 Donation (捐赠)