From 9eab104259ab162bf4af59824108f7c7ddf0a342 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 5 Sep 2022 20:03:39 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20WithTempQuery=20+=20Fr?= =?UTF-8?q?omQuery=20+=20=E5=AD=90=E6=9F=A5=E8=AF=A2=E7=9A=84=20bug?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ----- .../Curd/SqlServerSelectWithTempQueryTest.cs | 74 +++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 4 +- 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 @@ -800,14 +791,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index e10f938e..febc609f 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -1637,6 +1637,80 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name02' OR a.[Nickname] = N'name03 Assert.Equal(1, list15[1].rownum); Assert.Equal(5, list15[1].user.Id); Assert.Equal("name03", list15[1].user.Nickname); + + + var sql16 = 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, + subquery1 = fsql.Select().Where(c => c.Id == a.user.Id).Count(), + subquery2 = fsql.Select().Where(c => c.Id == b.Key.UserId).Count(), + }, FieldAliasOptions.AsProperty); + var assertSql16 = @"SELECT a.[Id], a.[Nickname], a.[rownum], b.[UserId], b.[Remark], b.[sum1], (SELECT count(1) + FROM [TwoTablePartitionBy_UserDto] c + WHERE (c.[Id] = a.[Id])) [subquery1], (SELECT count(1) + FROM [TwoTablePartitionBy_UserDto] c + WHERE (c.[Id] = b.[UserId])) [subquery2] +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(sql16, assertSql16); + var list16 = 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, + subquery1 = fsql.Select().Where(c => c.Id == a.user.Id).Count(), + subquery2 = fsql.Select().Where(c => c.Id == b.Key.UserId).Count(), + }); + Assert.Equal(list16.Count, 2); + Assert.Equal("remark04", list16[0].groupby.Key.Remark); + Assert.Equal(4, list16[0].groupby.Key.UserId); + Assert.Equal(4, list16[0].groupby.sum1); + Assert.Equal(1, list16[0].rownum); + Assert.Equal(4, list16[0].user.Id); + Assert.Equal("name02", list16[0].user.Nickname); + Assert.Equal(0, list16[0].subquery1); + Assert.Equal(0, list16[0].subquery2); + Assert.Equal("remark05", list16[1].groupby.Key.Remark); + Assert.Equal(5, list16[1].groupby.Key.UserId); + Assert.Equal(5, list16[1].groupby.sum1); + Assert.Equal(1, list16[1].rownum); + Assert.Equal(5, list16[1].user.Id); + Assert.Equal("name03", list16[1].user.Nickname); + Assert.Equal(0, list16[1].subquery1); + Assert.Equal(0, list16[1].subquery2); } class TwoTablePartitionBy_User { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index ebdf6917..9154c696 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1327,7 +1327,7 @@ namespace FreeSql.Internal //if (args[a] == null) ExpressionLambdaToSql(call3Exp.Arguments[a], fsqltables, null, null, SelectTableInfoType.From, true); } } - var isSubSelectPdme = tsc._tables == null && tsc.diymemexp != null; + var isSubSelectPdme = tsc._tables == null && tsc.diymemexp != null || tsc.diymemexp is Select0Provider.WithTempQueryParser; try { if (isSubSelectPdme) @@ -1735,6 +1735,8 @@ namespace FreeSql.Internal } if (callExp != null) return ExpressionLambdaToSql(callExp, tsc); var diymemexps = new[] { tsc.diymemexp, tsc.subSelect001?._diymemexpWithTempQuery }; + if (_subSelectParentDiyMemExps.Value?.Any() == true) + diymemexps = diymemexps.Concat(_subSelectParentDiyMemExps.Value).ToArray(); foreach (var diymemexp in diymemexps) { if (diymemexp != null)