From 79e3dcb6156f8cd3e3e37853dc961e209a1bccfd Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Wed, 10 May 2023 01:45:42 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20FromQuery=20+=20WithTe?=
=?UTF-8?q?mpQuery=20=E5=B5=8C=E5=A5=97=E6=9F=A5=E8=AF=A2=E5=A4=9A?=
=?UTF-8?q?=E5=B1=82=E5=90=8E=E5=88=AB=E5=90=8D=E9=97=AE=E9=A2=98=EF=BC=9B?=
=?UTF-8?q?#1510?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 18 --
.../Curd/SqlServerSelectWithTempQueryTest.cs | 169 ++++++++++++++++++
FreeSql/FreeSql.xml | 71 --------
FreeSql/Internal/CommonExpression.cs | 9 +
4 files changed, 178 insertions(+), 89 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 0da2b923..bbf089be 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs
@@ -9,6 +9,175 @@ namespace FreeSql.Tests.SqlServer
{
public class SqlServerSelectWithTempQueryTest
{
+ [Fact]
+ public void Issues1510()
+ {
+ var fsql = g.mysql;
+
+ var query = fsql.Select()
+ .FromQuery(fsql.Select().WithTempQuery(e => e))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ t.t1.Id,
+ t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ var sql = query.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM `Issues1510T1` a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query.ToList();
+
+ query = fsql.Select()
+ .FromQuery(fsql.Select().WithTempQuery(e => e).WithTempQuery(e => e))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ t.t1.Id,
+ t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM `Issues1510T1` a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query.ToList();
+
+ query = fsql.Select()
+ .FromQuery(fsql.Select().WithTempQuery(e => new { T2 = e }).WithTempQuery(e => e.T2))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ t.t1.Id,
+ t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM `Issues1510T1` a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query.ToList();
+
+ //////////////////////////
+
+ var query2 = fsql.Select()
+ .FromQuery(fsql.Select().WithTempQuery(e => e))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ T1Id = t.t1.Id,
+ T1Name = t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query2.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM `Issues1510T1` a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query2.ToList();
+
+ query2 = fsql.Select()
+ .FromQuery(fsql.Select().WithTempQuery(e => new { T2 = e }).WithTempQuery(e => e.T2))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ T1Id = t.t1.Id,
+ T1Name = t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query2.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM `Issues1510T1` a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query2.ToList();
+
+ query2 = fsql.Select()
+ .WithTempQuery(e => e)
+ .FromQuery(fsql.Select())
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ T1Id = t.t1.Id,
+ T1Name = t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query2.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM (
+ SELECT a.`Id`, a.`Name`
+ FROM `Issues1510T1` a ) a
+ INNER JOIN `Issues1510T2` htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query2.ToList();
+
+ query2 = fsql.Select()
+ .WithTempQuery(e => e)
+ .FromQuery(fsql.Select().WithTempQuery(e => e))
+ .InnerJoin(t => t.t1.Id == t.t2.T1JoinId)
+ .WithTempQuery(t => new
+ {
+ T1Id = t.t1.Id,
+ T1Name = t.t1.Name,
+ T2Id = t.t2.Id,
+ T2Name = t.t1.Name,
+ });
+ sql = query2.ToSql();
+ Assert.Equal(sql, @"SELECT *
+FROM (
+ SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name`
+ FROM (
+ SELECT a.`Id`, a.`Name`
+ FROM `Issues1510T1` a ) a
+ INNER JOIN (
+ SELECT a.`Id`, a.`Name`, a.`T1JoinId`
+ FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a");
+ query2.ToList();
+ }
+ public class Issues1510T1
+ {
+ public long Id { get; set; }
+ public string Name { get; set; }
+ }
+ public class Issues1510T2
+ {
+ public long Id { get; set; }
+ public string Name { get; set; }
+ public long T1JoinId { get; set; }
+ }
+
[Fact]
public void Issues1467()
{
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 3839bb08..5323d7da 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1073,55 +1073,6 @@
-
-
- 动态创建实体类型
-
-
-
-
- 配置Class
-
- 类名
- 类标记的特性[Table(Name = "xxx")] [Index(xxxx)]
-
-
-
-
- 配置属性
-
- 属性名称
- 属性类型
- 属性标记的特性-支持多个
-
-
-
-
- 配置父类
-
- 父类类型
-
-
-
-
- Emit动态创建出Class - Type
-
-
-
-
-
- 首字母小写
-
-
-
-
-
-
- 首字母大写
-
-
-
-
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
@@ -5741,28 +5692,6 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据
-
-
- 动态构建Class Type
-
-
-
-
-
- 根据字典,创建 table 对应的实体对象
-
-
-
-
-
-
-
- 根据实体对象,创建 table 对应的字典
-
-
-
-
-
C#: that >= between && that <= and
diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs
index 811cbe02..e2795d65 100644
--- a/FreeSql/Internal/CommonExpression.cs
+++ b/FreeSql/Internal/CommonExpression.cs
@@ -71,7 +71,16 @@ namespace FreeSql.Internal
field.Append(_common.FieldAsAlias(parent.DbNestedField));
}
else if (isdiymemexp && diymemexp?.ParseExpMapResult != null)
+ {
parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField;
+ if (EndsWithDbNestedField(parent.DbField, $" {parent.DbNestedField}") == false && //#1510 group by 产生的 DbField 自带 alias,因此需要此行判断
+ string.IsNullOrEmpty(parent.CsName) == false && localIndex == ReadAnonymousFieldAsCsName)
+ {
+ parent.DbNestedField = GetFieldAsCsName(parent.CsName);
+ if (EndsWithDbNestedField(parent.DbField, parent.DbNestedField) == false) //DbField 和 CsName 相同的时候,不处理
+ field.Append(_common.FieldAsAlias(parent.DbNestedField));
+ }
+ }
else if (string.IsNullOrEmpty(parent.CsName) == false)
{
parent.DbNestedField = GetFieldAsCsName(parent.CsName);