From 4018e6cb19cb505d4d5536f2be753432db3f4eb2 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 26 Jul 2022 19:30:34 +0800 Subject: [PATCH] =?UTF-8?q?fix=20WithTempQuery=20=E5=88=86=E7=BB=84?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 --- .../Curd/SqlServerSelectWithTempQueryTest.cs | 62 +++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 7 ++- .../SelectProvider/Select0Provider.cs | 5 ++ 4 files changed, 72 insertions(+), 11 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 13faa858..eb3f9792 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -964,6 +964,68 @@ WHERE (a.[rownum] = 1)"; Assert.Equal(list14[2].user.Nickname, "name03"); Assert.Equal(list14[2].userext.UserId, 5); Assert.Equal(list14[2].userext.Remark, "remark05"); + + + var sql15 = fsql.Select() + .WithTempQuery(a => new + { + user = a, + rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue() + }) + .Where(a => a.rownum == 1) + .FromQuery(fsql.Select().Where(b => b.UserId > 0) + .GroupBy(b => new { b.UserId, b.Remark }) + .WithTempQuery(b => new { b.Key, sum1 = b.Sum(b.Value.UserId) })) + .InnerJoin((a, b) => a.user.Id == b.Key.UserId) + .Where((a, b) => a.user.Nickname == "name02" || a.user.Nickname == "name03") + .ToSql((a, b) => new + { + user = a.user, + rownum = a.rownum, + groupby = b + }, FieldAliasOptions.AsProperty); + var assertSql15 = @"SELECT a.[Id], a.[Nickname], a.[rownum], b.[UserId], b.[Remark], b.[sum1] +FROM ( + SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] + FROM [TwoTablePartitionBy_User] a ) a +INNER JOIN ( + SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [sum1] + FROM [TwoTablePartitionBy_UserExt] a + WHERE (a.[UserId] > 0) + GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId] +WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name02' OR a.[Nickname] = N'name03'))"; + Assert.Equal(sql15, assertSql15); + var list15 = fsql.Select() + .WithTempQuery(a => new + { + user = a, + rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue() + }) + .Where(a => a.rownum == 1) + .FromQuery(fsql.Select().Where(b => b.UserId > 0) + .GroupBy(b => new { b.UserId, b.Remark }) + .WithTempQuery(b => new { b.Key, sum1 = b.Sum(b.Value.UserId) })) + .InnerJoin((a, b) => a.user.Id == b.Key.UserId) + .Where((a, b) => a.user.Nickname == "name02" || a.user.Nickname == "name03") + .ToList((a, b) => new + { + user = a.user, + rownum = a.rownum, + groupby = b + }); + Assert.Equal(list15.Count, 2); + Assert.Equal("remark04", list15[0].groupby.Key.Remark); + Assert.Equal(4, list15[0].groupby.Key.UserId); + Assert.Equal(4, list15[0].groupby.sum1); + Assert.Equal(1, list15[0].rownum); + Assert.Equal(4, list15[0].user.Id); + Assert.Equal("name02", list15[0].user.Nickname); + Assert.Equal("remark05", list15[1].groupby.Key.Remark); + Assert.Equal(5, list15[1].groupby.Key.UserId); + Assert.Equal(5, list15[1].groupby.sum1); + Assert.Equal(1, list15[1].rownum); + Assert.Equal(5, list15[1].user.Id); + Assert.Equal("name03", list15[1].user.Nickname); } class TwoTablePartitionBy_User { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index c4fb4e72..08c5bcf4 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1683,9 +1683,12 @@ namespace FreeSql.Internal if (callExp != null) return ExpressionLambdaToSql(callExp, tsc); if (tsc.diymemexp != null) { - var expStackFirst = expStack.First(); + var expStackFirst = expStack.First() as ParameterExpression; var bidx = expStackFirst.Type.FullName.StartsWith("FreeSql.ISelectGroupingAggregate`") ? 2 : 1; //.Key .Value - var diyexpResult = tsc.diymemexp.ParseExp(expStack.Where((a, b) => b >= bidx).ToArray()); + var diyexpMembers = expStack.Where((a, b) => b >= bidx).ToArray(); + if (diyexpMembers.Any() == false && tsc.diymemexp != null && tsc.diymemexp is Select0Provider.WithTempQueryParser tempQueryParser && tempQueryParser.GetOutsideSelectTable(expStackFirst) != null) + diyexpMembers = expStack.ToArray(); + var diyexpResult = tsc.diymemexp.ParseExp(diyexpMembers); if (string.IsNullOrEmpty(diyexpResult) == false) return diyexpResult; } var psgpdymes = _subSelectParentDiyMemExps.Value; //解决:分组之后的子查询解析 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 8fe90a58..d7854b61 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -218,6 +218,11 @@ namespace FreeSql.Internal.CommonProvider return $"{ParseExpMatchedTable.Alias}.{insideData.InsideMap.DbNestedField}"; } var read = insideData.InsideMap; + if (members.Length == 1 && members[0] == ParseExpMatchedTable.Parameter) + { + ParseExpMapResult = read; + return $"{ParseExpMatchedTable.Alias}.{read.DbNestedField}"; + } for (var a = 0; a < members.Length; a++) { read = read.Childs.Where(z => z.CsName == (members[a] as MemberExpression)?.Member.Name).FirstOrDefault();