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);