From e68806a3b2716744d850f4a0a52819146bdc315a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 15 Aug 2022 15:59:00 +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=E7=9A=84=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Curd/SqlServerSelectWithTempQueryTest.cs | 39 ++++++++++++++++++- FreeSql/Internal/CommonExpression.cs | 19 +++++---- .../SelectProvider/Select0Provider.cs | 23 +++++------ 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index bc003d3f..cc445e7e 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -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]) FROM [bie_2] ti2 WHERE (ti2.[RefHeadId] = ht2.[HeadId] AND ti2.[RefItemId] = ht2.[Id])), 0) [RefQuantity] - FROM [BaseHeadEntity] ht1 + FROM [bhe_1] ht1 INNER JOIN ( SELECT bi.[IsDeleted], bi.[Id], bi.[HeadId], bi.[GoodsId], bi.[Quantity], bi.[RefHeadId], bi.[RefItemId] FROM [bie_1] bi @@ -79,6 +79,43 @@ WHERE (((a.[Id]) in (SELECT DISTINCT v.[Id] WHERE (bh.[IsDeleted] = 0) ) v WHERE (v.[RefQuantity] < v.[Quantity])))) ORDER BY a.[Date] DESC", sql2); + + var 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) + .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] diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 52c52b6e..2081e185 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1083,13 +1083,6 @@ namespace FreeSql.Internal 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`")) { //子表查询 switch (exp3.Method.Name) @@ -2268,7 +2261,9 @@ namespace FreeSql.Internal public LambdaExpression Modify(LambdaExpression lambda, List tables) { 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); return Expression.Lambda(exp, parameters); } @@ -2282,13 +2277,21 @@ namespace FreeSql.Internal if (parent.Expression?.NodeType == ExpressionType.Parameter && parent.Expression.Type.Name.StartsWith("HzyTuple`") == true && 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); + } } if (node.Expression?.NodeType == ExpressionType.Parameter && node.Expression.Type.Name.StartsWith("HzyTuple`") == true && 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 base.VisitMember(node); } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 060cf9a5..7c5e0a71 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -93,23 +93,18 @@ namespace FreeSql.Internal.CommonProvider if (lambParms == null) { - var fromTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList(); - if (fromTables.Count > 0) - { - to._tables = new List(to._tables); - to._tables.AddRange(fromTables); - } + var fromParentTables = from._tables.Where(a => a.Type == SelectTableInfoType.Parent).ToList(); + 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(fromTables); else { - if (to._tables.Count <= from._tables.Count) - to._tables = new List(from._tables.ToArray()); - else - { - to._tables = new List(to._tables); - for (var a = 0; a < from._tables.Count; a++) - to._tables[a] = from._tables[a]; - } + to._tables = new List(to._tables); + for (var a = 0; a < fromTables.Count; a++) + to._tables[a] = fromTables[a]; } + if (fromParentTables.Any()) + to._tables.AddRange(fromParentTables); } else {