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)