mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	fix WithTempQuery 05
This commit is contained in:
		@@ -800,14 +800,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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -174,6 +174,57 @@ WHERE (a.[rownum] = 1)";
 | 
				
			|||||||
            Assert.Equal(list04[1].Id, 4);
 | 
					            Assert.Equal(list04[1].Id, 4);
 | 
				
			||||||
            Assert.Equal(list04[2].rownum, 1);
 | 
					            Assert.Equal(list04[2].rownum, 1);
 | 
				
			||||||
            Assert.Equal(list04[2].Id, 5);
 | 
					            Assert.Equal(list04[2].Id, 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql05 = fsql.Select<TwoTablePartitionBy_User>()
 | 
				
			||||||
 | 
					                 .Where(a => a.Id > 0)
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     a.Id,
 | 
				
			||||||
 | 
					                     a.Nickname
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .GroupBy(a => new { a.Nickname })
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     a.Key,
 | 
				
			||||||
 | 
					                     sum1 = a.Sum(a.Value.Id),
 | 
				
			||||||
 | 
					                     cou1 = a.Count()
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .ToSql();
 | 
				
			||||||
 | 
					            var assertSql05 = @"SELECT * 
 | 
				
			||||||
 | 
					FROM ( 
 | 
				
			||||||
 | 
					    SELECT a.[Nickname], sum(a.[Id]) [sum1], count(1) [cou1] 
 | 
				
			||||||
 | 
					    FROM ( 
 | 
				
			||||||
 | 
					        SELECT a.[Id], a.[Nickname] 
 | 
				
			||||||
 | 
					        FROM [TwoTablePartitionBy_User] a 
 | 
				
			||||||
 | 
					        WHERE (a.[Id] > 0) ) a 
 | 
				
			||||||
 | 
					    GROUP BY a.[Nickname] ) a";
 | 
				
			||||||
 | 
					            Assert.Equal(assertSql05, sql05);
 | 
				
			||||||
 | 
					            var list05 = fsql.Select<TwoTablePartitionBy_User>()
 | 
				
			||||||
 | 
					                 .Where(a => a.Id > 0)
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     a.Id,
 | 
				
			||||||
 | 
					                     a.Nickname
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .GroupBy(a => new { a.Nickname })
 | 
				
			||||||
 | 
					                 .WithTempQuery(a => new
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     a.Key,
 | 
				
			||||||
 | 
					                     sum1 = a.Sum(a.Value.Id),
 | 
				
			||||||
 | 
					                     cou1 = a.Count()
 | 
				
			||||||
 | 
					                 })
 | 
				
			||||||
 | 
					                 .ToList();
 | 
				
			||||||
 | 
					            Assert.Equal(3, list05.Count);
 | 
				
			||||||
 | 
					            Assert.Equal("name01", list05[0].Key.Nickname);
 | 
				
			||||||
 | 
					            Assert.Equal(6, list05[0].sum1);
 | 
				
			||||||
 | 
					            Assert.Equal(3, list05[0].cou1);
 | 
				
			||||||
 | 
					            Assert.Equal("name02", list05[1].Key.Nickname);
 | 
				
			||||||
 | 
					            Assert.Equal(4, list05[1].sum1);
 | 
				
			||||||
 | 
					            Assert.Equal(1, list05[1].cou1);
 | 
				
			||||||
 | 
					            Assert.Equal("name03", list05[2].Key.Nickname);
 | 
				
			||||||
 | 
					            Assert.Equal(11, list05[2].sum1);
 | 
				
			||||||
 | 
					            Assert.Equal(2, list05[2].cou1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        class SingleTablePartitionBy_User
 | 
					        class SingleTablePartitionBy_User
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -527,7 +578,8 @@ FROM (
 | 
				
			|||||||
        SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
					        SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
				
			||||||
        FROM [TwoTablePartitionBy_User] a ) a 
 | 
					        FROM [TwoTablePartitionBy_User] a ) a 
 | 
				
			||||||
    WHERE (a.[rownum] = 1) ) a 
 | 
					    WHERE (a.[rownum] = 1) ) a 
 | 
				
			||||||
INNER JOIN (SELECT a.[UserId], a.[Remark] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[UserId], a.[Remark] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_UserExt] a) b ON a.[Id] = b.[UserId] 
 | 
					    FROM [TwoTablePartitionBy_UserExt] a) b ON a.[Id] = b.[UserId] 
 | 
				
			||||||
WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
					WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
				
			||||||
            Assert.Equal(sql07, assertSql07);
 | 
					            Assert.Equal(sql07, assertSql07);
 | 
				
			||||||
@@ -567,7 +619,8 @@ WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
				
			|||||||
FROM ( 
 | 
					FROM ( 
 | 
				
			||||||
    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
					    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_User] a ) a 
 | 
					    FROM [TwoTablePartitionBy_User] a ) a 
 | 
				
			||||||
INNER JOIN (SELECT a.[UserId], a.[Remark] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[UserId], a.[Remark] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_UserExt] a 
 | 
					    FROM [TwoTablePartitionBy_UserExt] a 
 | 
				
			||||||
    WHERE (a.[UserId] > 0)) b ON a.[Id] = b.[UserId] 
 | 
					    WHERE (a.[UserId] > 0)) b ON a.[Id] = b.[UserId] 
 | 
				
			||||||
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
					WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
				
			||||||
@@ -599,7 +652,7 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
                    rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
					                    rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
                .Where(a => a.rownum == 1)
 | 
					                .Where(a => a.rownum == 1)
 | 
				
			||||||
                .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
 | 
					                .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).WithTempQuery(b => new { b.UserId, b.Remark }))
 | 
				
			||||||
                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
					                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
				
			||||||
                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
					                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
				
			||||||
                .ToSql((a, b) => new TwoTablePartitionBy_UserDto());
 | 
					                .ToSql((a, b) => new TwoTablePartitionBy_UserDto());
 | 
				
			||||||
@@ -607,10 +660,10 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
FROM ( 
 | 
					FROM ( 
 | 
				
			||||||
    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
					    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_User] a ) a 
 | 
					    FROM [TwoTablePartitionBy_User] a ) a 
 | 
				
			||||||
INNER JOIN ( SELECT a.[UserId], a.[Remark] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[UserId], a.[Remark] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_UserExt] a 
 | 
					    FROM [TwoTablePartitionBy_UserExt] a 
 | 
				
			||||||
    WHERE (a.[UserId] > 0) 
 | 
					    WHERE (a.[UserId] > 0) ) b ON a.[Id] = b.[UserId] 
 | 
				
			||||||
    GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId] 
 | 
					 | 
				
			||||||
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
					WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
 | 
				
			||||||
            Assert.Equal(sql09, assertSql09);
 | 
					            Assert.Equal(sql09, assertSql09);
 | 
				
			||||||
            var list09 = fsql.Select<TwoTablePartitionBy_User>()
 | 
					            var list09 = fsql.Select<TwoTablePartitionBy_User>()
 | 
				
			||||||
@@ -620,7 +673,7 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
                    rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
					                    rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
                .Where(a => a.rownum == 1)
 | 
					                .Where(a => a.rownum == 1)
 | 
				
			||||||
                .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
 | 
					                .FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).WithTempQuery(b => new { b.UserId, b.Remark }))
 | 
				
			||||||
                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
					                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
				
			||||||
                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
					                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
				
			||||||
                .ToList<TwoTablePartitionBy_UserDto>();
 | 
					                .ToList<TwoTablePartitionBy_UserDto>();
 | 
				
			||||||
@@ -633,6 +686,48 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
            Assert.Equal(list09[1].remark, "remark05");
 | 
					            Assert.Equal(list09[1].remark, "remark05");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var sql091 = 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 => b.Key))
 | 
				
			||||||
 | 
					                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
				
			||||||
 | 
					                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
				
			||||||
 | 
					                .ToSql((a, b) => new TwoTablePartitionBy_UserDto());
 | 
				
			||||||
 | 
					            var assertSql091 = @"SELECT a.[rownum] as1, b.[Remark] as2 
 | 
				
			||||||
 | 
					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] 
 | 
				
			||||||
 | 
					    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'name03' OR a.[Nickname] = N'name02'))";
 | 
				
			||||||
 | 
					            Assert.Equal(sql091, assertSql091);
 | 
				
			||||||
 | 
					            var list091 = 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 => b.Key))
 | 
				
			||||||
 | 
					                .InnerJoin((a, b) => a.user.Id == b.UserId)
 | 
				
			||||||
 | 
					                .Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
 | 
				
			||||||
 | 
					                .ToList<TwoTablePartitionBy_UserDto>();
 | 
				
			||||||
 | 
					            Assert.Equal(list091.Count, 2);
 | 
				
			||||||
 | 
					            Assert.Equal(list091[0].rownum, 1);
 | 
				
			||||||
 | 
					            Assert.Equal(list091[0].Id, 0);
 | 
				
			||||||
 | 
					            Assert.Equal(list091[0].remark, "remark04");
 | 
				
			||||||
 | 
					            Assert.Equal(list091[1].rownum, 1);
 | 
				
			||||||
 | 
					            Assert.Equal(list091[1].Id, 0);
 | 
				
			||||||
 | 
					            Assert.Equal(list091[1].remark, "remark05");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sql10 = fsql.Select<TwoTablePartitionBy_User>()
 | 
					            var sql10 = fsql.Select<TwoTablePartitionBy_User>()
 | 
				
			||||||
                .WithTempQuery(a => new
 | 
					                .WithTempQuery(a => new
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -648,7 +743,8 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
FROM ( 
 | 
					FROM ( 
 | 
				
			||||||
    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
					    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_User] a ) a 
 | 
					    FROM [TwoTablePartitionBy_User] a ) a 
 | 
				
			||||||
INNER JOIN ( SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [rownum] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_UserExt] a 
 | 
					    FROM [TwoTablePartitionBy_UserExt] a 
 | 
				
			||||||
    WHERE (a.[UserId] > 0) 
 | 
					    WHERE (a.[UserId] > 0) 
 | 
				
			||||||
    GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId] 
 | 
					    GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId] 
 | 
				
			||||||
@@ -689,7 +785,8 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
 | 
				
			|||||||
FROM ( 
 | 
					FROM ( 
 | 
				
			||||||
    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
					    SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_User] a ) a 
 | 
					    FROM [TwoTablePartitionBy_User] a ) a 
 | 
				
			||||||
INNER JOIN ( SELECT a.[UserId] [uid], sum(a.[UserId]) [rownum] 
 | 
					INNER JOIN ( 
 | 
				
			||||||
 | 
					    SELECT a.[UserId] [uid], sum(a.[UserId]) [rownum] 
 | 
				
			||||||
    FROM [TwoTablePartitionBy_UserExt] a 
 | 
					    FROM [TwoTablePartitionBy_UserExt] a 
 | 
				
			||||||
    WHERE (a.[UserId] > 0) 
 | 
					    WHERE (a.[UserId] > 0) 
 | 
				
			||||||
    GROUP BY a.[UserId] ) b ON a.[Id] = b.[uid] 
 | 
					    GROUP BY a.[UserId] ) b ON a.[Id] = b.[uid] 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,14 +51,14 @@ namespace FreeSql.Internal
 | 
				
			|||||||
        public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select, 
 | 
					        public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select, 
 | 
				
			||||||
            BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
 | 
					            BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            void LocalSetFieldAlias(ref int localIndex)
 | 
					            void LocalSetFieldAlias(ref int localIndex, bool isdiymemexp)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (localIndex >= 0)
 | 
					                if (localIndex >= 0)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    parent.DbNestedField = $"as{++localIndex}";
 | 
					                    parent.DbNestedField = $"as{++localIndex}";
 | 
				
			||||||
                    field.Append(_common.FieldAsAlias(parent.DbNestedField));
 | 
					                    field.Append(_common.FieldAsAlias(parent.DbNestedField));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else if (diymemexp?.ParseExpMapResult != null)
 | 
					                else if (isdiymemexp && diymemexp?.ParseExpMapResult != null)
 | 
				
			||||||
                    parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField;
 | 
					                    parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField;
 | 
				
			||||||
                else if (string.IsNullOrEmpty(parent.CsName) == false)
 | 
					                else if (string.IsNullOrEmpty(parent.CsName) == false)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -77,7 +77,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                case ExpressionType.NegateChecked:
 | 
					                case ExpressionType.NegateChecked:
 | 
				
			||||||
                    parent.DbField = $"-({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, getTSC())})";
 | 
					                    parent.DbField = $"-({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, getTSC())})";
 | 
				
			||||||
                    field.Append(", ").Append(parent.DbField);
 | 
					                    field.Append(", ").Append(parent.DbField);
 | 
				
			||||||
                    LocalSetFieldAlias(ref index);
 | 
					                    LocalSetFieldAlias(ref index, false);
 | 
				
			||||||
                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
					                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                case ExpressionType.Convert: return ReadAnonymousField(_tables, _tableRule, field, parent, ref index, (exp as UnaryExpression)?.Operand, select, diymemexp, whereGlobalFilter, findIncludeMany, findSubSelectMany, isAllDtoMap);
 | 
					                case ExpressionType.Convert: return ReadAnonymousField(_tables, _tableRule, field, parent, ref index, (exp as UnaryExpression)?.Operand, select, diymemexp, whereGlobalFilter, findIncludeMany, findSubSelectMany, isAllDtoMap);
 | 
				
			||||||
@@ -96,7 +96,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        parent.DbField = _common.FormatSql("{0}", constExp?.Value);
 | 
					                        parent.DbField = _common.FormatSql("{0}", constExp?.Value);
 | 
				
			||||||
                    field.Append(", ").Append(parent.DbField);
 | 
					                    field.Append(", ").Append(parent.DbField);
 | 
				
			||||||
                    LocalSetFieldAlias(ref index);
 | 
					                    LocalSetFieldAlias(ref index, false);
 | 
				
			||||||
                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
					                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                case ExpressionType.Conditional:
 | 
					                case ExpressionType.Conditional:
 | 
				
			||||||
@@ -125,7 +125,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        parent.DbField = ExpressionLambdaToSql(exp, getTSC());
 | 
					                        parent.DbField = ExpressionLambdaToSql(exp, getTSC());
 | 
				
			||||||
                    field.Append(", ").Append(parent.DbField);
 | 
					                    field.Append(", ").Append(parent.DbField);
 | 
				
			||||||
                    LocalSetFieldAlias(ref index);
 | 
					                    LocalSetFieldAlias(ref index, false);
 | 
				
			||||||
                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
					                    if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                case ExpressionType.Parameter:
 | 
					                case ExpressionType.Parameter:
 | 
				
			||||||
@@ -273,7 +273,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                            if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield);
 | 
					                            if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        field.Append(", ").Append(pdbfield);
 | 
					                        field.Append(", ").Append(pdbfield);
 | 
				
			||||||
                        LocalSetFieldAlias(ref index);
 | 
					                        LocalSetFieldAlias(ref index, true);
 | 
				
			||||||
                        return false;
 | 
					                        return false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
@@ -486,7 +486,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
 | 
					            parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
 | 
				
			||||||
            field.Append(", ").Append(parent.DbField);
 | 
					            field.Append(", ").Append(parent.DbField);
 | 
				
			||||||
            LocalSetFieldAlias(ref index);
 | 
					            LocalSetFieldAlias(ref index, false);
 | 
				
			||||||
            if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
					            if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -2178,6 +2178,23 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        public class ReplaceVisitor : ExpressionVisitor
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            private Expression _oldexp;
 | 
				
			||||||
 | 
					            private Expression _newexp;
 | 
				
			||||||
 | 
					            public Expression Modify(Expression find, Expression oldexp, Expression newexp)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                this._oldexp = oldexp;
 | 
				
			||||||
 | 
					                this._newexp = newexp;
 | 
				
			||||||
 | 
					                return Visit(find);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            protected override Expression VisitMember(MemberExpression node)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (node.Expression == _oldexp)
 | 
				
			||||||
 | 
					                    return Expression.Property(_newexp, node.Member.Name);
 | 
				
			||||||
 | 
					                return base.VisitMember(node);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        public class ReplaceParameterVisitor : ExpressionVisitor
 | 
					        public class ReplaceParameterVisitor : ExpressionVisitor
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            private Expression _replaceExp;
 | 
					            private Expression _replaceExp;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,11 +141,12 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
 | 
					                    sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
 | 
				
			||||||
                    if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
 | 
					                    if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
 | 
				
			||||||
 | 
					                    if (sql2.StartsWith(" \r\n")) sql2 = sql2.Substring(3);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (string.IsNullOrWhiteSpace(sql2))
 | 
					                if (string.IsNullOrWhiteSpace(sql2))
 | 
				
			||||||
                    sql2 = select2?.ToSql("*");
 | 
					                    sql2 = select2?.ToSql("*");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return ret.WithSql(null, sql2);
 | 
					            return ret.WithSql(null, $" \r\n{sql2}");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
 | 
					        public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                ParseExpMapResult = _map;
 | 
					                ParseExpMapResult = _map;
 | 
				
			||||||
                return _map.DbField;
 | 
					                return _map.DbField;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var parentName = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression)?.Member.Name;
 | 
					            var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression);
 | 
				
			||||||
 | 
					            var parentName = firstMember?.Member.Name;
 | 
				
			||||||
            switch (parentName)
 | 
					            switch (parentName)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                case "Key":
 | 
					                case "Key":
 | 
				
			||||||
@@ -51,8 +52,35 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    ParseExpMapResult = read;
 | 
					                    ParseExpMapResult = read;
 | 
				
			||||||
                    return read.DbField;
 | 
					                    return read.DbField;
 | 
				
			||||||
                case "Value":
 | 
					                case "Value":
 | 
				
			||||||
                    var tb = _tables.First();
 | 
					                    var curtables = _tables;
 | 
				
			||||||
 | 
					                    SelectTableInfo curtable = null;
 | 
				
			||||||
                    var foridx = 0;
 | 
					                    var foridx = 0;
 | 
				
			||||||
 | 
					                    if (_select._diymemexpWithTempQuery != null && _select._diymemexpWithTempQuery is Select0Provider.WithTempQueryParser tempQueryParser)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (_select._tables.Count == 1)
 | 
				
			||||||
 | 
					                            curtable = _select._tables[0];
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            curtables = _select._tables;
 | 
				
			||||||
 | 
					                            LocalValueInitData();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        if (tempQueryParser._outsideTable.Contains(curtable))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            for (var a = 0; a < members.Length; a++)
 | 
				
			||||||
 | 
					                                members[a] = new CommonExpression.ReplaceVisitor().Modify(members[a], firstMember, curtable.Parameter);
 | 
				
			||||||
 | 
					                            var ret = _select._diymemexpWithTempQuery.ParseExp(members);
 | 
				
			||||||
 | 
					                            ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult;
 | 
				
			||||||
 | 
					                            return ret;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        LocalValueInitData();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    void LocalValueInitData()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        curtable = curtables.First();
 | 
				
			||||||
                        if (members.Length > 1)
 | 
					                        if (members.Length > 1)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            var mem0 = (members.FirstOrDefault() as MemberExpression);
 | 
					                            var mem0 = (members.FirstOrDefault() as MemberExpression);
 | 
				
			||||||
@@ -63,17 +91,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                                else
 | 
					                                else
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    //var alias = $"SP10{(char)(96 + tryitemidx)}";
 | 
					                                    //var alias = $"SP10{(char)(96 + tryitemidx)}";
 | 
				
			||||||
                                var tmptb = _tables.Where((a, idx) => //a.AliasInit == alias && 
 | 
					                                    var tmptb = curtables.Where((a, idx) => //a.AliasInit == alias && 
 | 
				
			||||||
                                        a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault();
 | 
					                                        a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault();
 | 
				
			||||||
                                    if (tmptb != null)
 | 
					                                    if (tmptb != null)
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                    tb = tmptb;
 | 
					                                        curtable = tmptb;
 | 
				
			||||||
                                        foridx++;
 | 
					                                        foridx++;
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    var parmExp = Expression.Parameter(tb.Table.Type, tb.Alias);
 | 
					                    }
 | 
				
			||||||
 | 
					                    var parmExp = Expression.Parameter(curtable.Table.Type, curtable.Alias);
 | 
				
			||||||
                    Expression retExp = parmExp;
 | 
					                    Expression retExp = parmExp;
 | 
				
			||||||
                    for (var a = foridx; a < members.Length; a++)
 | 
					                    for (var a = foridx; a < members.Length; a++)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
@@ -205,7 +234,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            var ret = (_orm as BaseDbProvider).CreateSelectProvider<TDto>(null) as Select1Provider<TDto>;
 | 
					            var ret = (_orm as BaseDbProvider).CreateSelectProvider<TDto>(null) as Select1Provider<TDto>;
 | 
				
			||||||
            if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto));
 | 
					            if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto));
 | 
				
			||||||
            var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]);
 | 
					            var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]);
 | 
				
			||||||
            var sql = this.ToSql(parser._insideSelectList[0].InsideField);
 | 
					            var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
 | 
				
			||||||
            ret.WithSql(sql);
 | 
					            ret.WithSql(sql);
 | 
				
			||||||
            ret._diymemexpWithTempQuery = parser;
 | 
					            ret._diymemexpWithTempQuery = parser;
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user