mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 WithTempQuery + FromQuery + 子查询的 bug;
This commit is contained in:
		@@ -733,15 +733,6 @@
 | 
				
			|||||||
            <param name="modelBuilder"></param>
 | 
					            <param name="modelBuilder"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSqlDbContextExtensions.ApplyConfigurationsFromAssembly(FreeSql.ICodeFirst,System.Reflection.Assembly,System.Func{System.Type,System.Boolean})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="codeFirst"></param>
 | 
					 | 
				
			||||||
            <param name="assembly"></param>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
 | 
					        <member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            创建普通数据上下文档对象
 | 
					            创建普通数据上下文档对象
 | 
				
			||||||
@@ -800,14 +791,5 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            批量注入 Repository,可以参考代码自行调整
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="services"></param>
 | 
					 | 
				
			||||||
            <param name="globalDataFilter"></param>
 | 
					 | 
				
			||||||
            <param name="assemblies"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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(1, list15[1].rownum);
 | 
				
			||||||
            Assert.Equal(5, list15[1].user.Id);
 | 
					            Assert.Equal(5, list15[1].user.Id);
 | 
				
			||||||
            Assert.Equal("name03", list15[1].user.Nickname);
 | 
					            Assert.Equal("name03", list15[1].user.Nickname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql16 = fsql.Select<TwoTablePartitionBy_User>()
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     user = a,
 | 
				
			||||||
 | 
					                     rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .Where(a => a.rownum == 1)
 | 
				
			||||||
 | 
					                 .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().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<TwoTablePartitionBy_UserDto>().Where(c => c.Id == a.user.Id).Count(),
 | 
				
			||||||
 | 
					                     subquery2 = fsql.Select<TwoTablePartitionBy_UserDto>().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<TwoTablePartitionBy_User>()
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     user = a,
 | 
				
			||||||
 | 
					                     rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .Where(a => a.rownum == 1)
 | 
				
			||||||
 | 
					                 .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().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<TwoTablePartitionBy_UserDto>().Where(c => c.Id == a.user.Id).Count(),
 | 
				
			||||||
 | 
					                     subquery2 = fsql.Select<TwoTablePartitionBy_UserDto>().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
 | 
					        class TwoTablePartitionBy_User
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1327,7 +1327,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                                                //if (args[a] == null) ExpressionLambdaToSql(call3Exp.Arguments[a], fsqltables, null, null, SelectTableInfoType.From, true);
 | 
					                                                //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
 | 
					                                        try
 | 
				
			||||||
                                        {
 | 
					                                        {
 | 
				
			||||||
                                            if (isSubSelectPdme)
 | 
					                                            if (isSubSelectPdme)
 | 
				
			||||||
@@ -1735,6 +1735,8 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    if (callExp != null) return ExpressionLambdaToSql(callExp, tsc);
 | 
					                    if (callExp != null) return ExpressionLambdaToSql(callExp, tsc);
 | 
				
			||||||
                    var diymemexps = new[] { tsc.diymemexp, tsc.subSelect001?._diymemexpWithTempQuery };
 | 
					                    var diymemexps = new[] { tsc.diymemexp, tsc.subSelect001?._diymemexpWithTempQuery };
 | 
				
			||||||
 | 
					                    if (_subSelectParentDiyMemExps.Value?.Any() == true) 
 | 
				
			||||||
 | 
					                        diymemexps = diymemexps.Concat(_subSelectParentDiyMemExps.Value).ToArray();
 | 
				
			||||||
                    foreach (var diymemexp in diymemexps)
 | 
					                    foreach (var diymemexp in diymemexps)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        if (diymemexp != null)
 | 
					                        if (diymemexp != null)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user