From 119b8f0ec0d9d511cfc02ad5cfb62b9c87ad7d5a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 25 Dec 2020 16:03:33 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20HzyTuple=20=E5=AD=90?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=A7=A3=E6=9E=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 +++++++ .../SqlServerExpression/StringTest.cs | 26 +++++++++++++++--- FreeSql/Internal/CommonExpression.cs | 27 ++++++++++++++----- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 02eb0609..27909b2e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -512,5 +512,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/StringTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/StringTest.cs index 48074e69..f1bbe92f 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/StringTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerExpression/StringTest.cs @@ -135,9 +135,29 @@ namespace FreeSql.Tests.SqlServerExpression w.UserName, ǰɫ = string.Join(",", repo.Orm .Select() - .LeftJoin((b, c) => b.RoleId == c.Id) - .Where((b, c) => b.UserId == w.Id) - .ToList((b, c) => c.RoleName)) + .LeftJoin((a, c) => a.RoleId == c.Id) + .Where((a, c) => a.UserId == w.Id) + .ToList((a, c) => c.RoleName)) + }); + Assert.Equal(2, result.Count); + Assert.Equal(users[0].Id, result[0].Id); + Assert.Equal("user01", result[0].UserName); + Assert.Equal("role01,role02,role03", result[0].ǰɫ); + + Assert.Equal(users[1].Id, result[1].Id); + Assert.Equal("user02", result[1].UserName); + Assert.Equal("role01,role03", result[1].ǰɫ); + + result = repo.Select.ToList(w => + new + { + w.Id, + w.UserName, + ǰɫ = string.Join(",", repo.Orm + .Select() + .LeftJoin(b => b.t1.RoleId == b.t2.Id) + .Where(b => b.t1.UserId == w.Id) + .ToList(b => b.t2.RoleName)) }); Assert.Equal(2, result.Count); Assert.Equal(users[0].Id, result[0].Id); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 1858e48e..1ee15fca 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1053,8 +1053,17 @@ namespace FreeSql.Internal fsqltable1SetAlias = true; var argExpLambda = argExp as LambdaExpression; var fsqlTypeGenericArgs = fsqlType.GetGenericArguments(); - for (var gai = 0; gai < fsqlTypeGenericArgs.Length && gai < argExpLambda.Parameters.Count; gai++) - fsqltables[gai].Alias = argExpLambda.Parameters[gai].Name; + + if (argExpLambda.Parameters.Count == 1 && argExpLambda.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`")) + { + for (var gai = 0; gai < fsqlTypeGenericArgs.Length; gai++) + fsqltables[gai].Alias = "ht" + (gai + 1); + } + else + { + for (var gai = 0; gai < fsqlTypeGenericArgs.Length && gai < argExpLambda.Parameters.Count; gai++) + fsqltables[gai].Alias = argExpLambda.Parameters[gai].Name; + } } } args[a] = argExp ?? Expression.Lambda(arg3Exp).Compile().DynamicInvoke(); @@ -1249,7 +1258,10 @@ namespace FreeSql.Internal tscClone1.subSelect001 = fsql as Select0Provider; //#405 Oracle within group(order by ..) tscClone1.isDisableDiyParse = false; tscClone1._tables = fsqltables; - var sqlSum = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3.Arguments.FirstOrDefault(), tscClone1)})" })?.ToString(); + var exp3Args0 = (exp3.Arguments.FirstOrDefault() as UnaryExpression)?.Operand as LambdaExpression; + if (exp3Args0.Parameters.Count == 1 && exp3Args0.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`")) + exp3Args0 = new ReplaceHzyTupleToMultiParam().Modify(exp3Args0, fsqltables); + var sqlSum = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { $"{exp3.Method.Name.ToLower()}({ExpressionLambdaToSql(exp3Args0, tscClone1)})" })?.ToString(); if (string.IsNullOrEmpty(sqlSum) == false) return $"({sqlSum.Replace(" \r\n", " \r\n ")})"; break; @@ -1260,7 +1272,10 @@ namespace FreeSql.Internal tscClone2.subSelect001 = fsql as Select0Provider; //#405 Oracle within group(order by ..) tscClone2.isDisableDiyParse = false; tscClone2._tables = fsqltables; - var sqlFirst = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { ExpressionLambdaToSql(exp3.Arguments.FirstOrDefault(), tscClone2) })?.ToString(); + var exp3Args02 = (exp3.Arguments.FirstOrDefault() as UnaryExpression)?.Operand as LambdaExpression; + if (exp3Args02.Parameters.Count == 1 && exp3Args02.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`")) + exp3Args02 = new ReplaceHzyTupleToMultiParam().Modify(exp3Args02, fsqltables); + var sqlFirst = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { ExpressionLambdaToSql(exp3Args02, tscClone2) })?.ToString(); if (string.IsNullOrEmpty(sqlFirst) == false) return $"({sqlFirst.Replace(" \r\n", " \r\n ")})"; break; @@ -1794,8 +1809,8 @@ namespace FreeSql.Internal private ParameterExpression[] parameters; public LambdaExpression Modify(LambdaExpression lambda, List tables) { - this.tables = tables; - parameters = tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray(); + this.tables = tables.Where(a => a.Type != SelectTableInfoType.Parent).ToList(); + parameters = this.tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray(); var exp = Visit(lambda.Body); return Expression.Lambda(exp, parameters); }