From 467f70a4760617f8ec655516c12b1833d1a6fc4a Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 25 Mar 2022 14:57:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0join=20=E4=B8=BA4=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SugarProvider/SqlSugarProvider.cs | 65 +++++++++++++++++++ .../SqlSugar/Interface/ISqlSugarClient.cs | 22 +++++-- Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs | 12 +++- Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs | 9 ++- 4 files changed, 99 insertions(+), 9 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 15c911db9..76e94d1ca 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -501,6 +501,71 @@ namespace SqlSugar queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType2, JoinWhere = exp2.GetResultString(), TableName = sqlBuilder.GetPackTable(sql3, shortName3) }); return queryable; } + + public virtual ISugarQueryable Queryable( + ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, ISugarQueryable joinQueryable3, ISugarQueryable joinQueryable4, + JoinType joinType1, Expression> joinExpression1, + JoinType joinType2, Expression> joinExpression2, + JoinType joinType3, Expression> joinExpression3 + ) where T : class, new() where T2 : class, new() where T3 : class, new() where T4 : class, new() + { + Check.Exception(joinQueryable1.QueryBuilder.Take != null || joinQueryable1.QueryBuilder.Skip != null || joinQueryable1.QueryBuilder.OrderByValue.HasValue(), "joinQueryable1 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + Check.Exception(joinQueryable2.QueryBuilder.Take != null || joinQueryable2.QueryBuilder.Skip != null || joinQueryable2.QueryBuilder.OrderByValue.HasValue(), "joinQueryable2 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + Check.Exception(joinQueryable3.QueryBuilder.Take != null || joinQueryable3.QueryBuilder.Skip != null || joinQueryable3.QueryBuilder.OrderByValue.HasValue(), "joinQueryable3 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + Check.Exception(joinQueryable4.QueryBuilder.Take != null || joinQueryable4.QueryBuilder.Skip != null || joinQueryable4.QueryBuilder.OrderByValue.HasValue(), "joinQueryable4 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'"); + var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); + + sqlBuilder.Context = this; + InitMappingInfo(); + var types = new Type[] { typeof(T2) }; + var queryable = InstanceFactory.GetQueryable(this.CurrentConnectionConfig); + queryable.Context = this.Context; + queryable.SqlBuilder = sqlBuilder; + queryable.QueryBuilder = InstanceFactory.GetQueryBuilder(this.CurrentConnectionConfig); + queryable.QueryBuilder.JoinQueryInfos = new List(); + queryable.QueryBuilder.Builder = sqlBuilder; + queryable.QueryBuilder.Context = this; + queryable.QueryBuilder.EntityType = typeof(T); + queryable.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.CurrentConnectionConfig); + + //master + var shortName1 = joinExpression1.Parameters[0].Name; + var sqlObj1 = joinQueryable1.ToSql(); + string sql1 = sqlObj1.Key; + UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0, "Join"); + queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, shortName1); ; + queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value); + + //join table 1 + var shortName2 = joinExpression1.Parameters[1].Name; + var sqlObj2 = joinQueryable2.ToSql(); + string sql2 = sqlObj2.Key; + UtilMethods.RepairReplicationParameters(ref sql2, sqlObj2.Value.ToArray(), 1, "Join"); + queryable.QueryBuilder.Parameters.AddRange(sqlObj2.Value); + var exp = queryable.QueryBuilder.GetExpressionValue(joinExpression1, ResolveExpressType.WhereMultiple); + queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 0, JoinType = joinType1, JoinWhere = exp.GetResultString(), TableName = sqlBuilder.GetPackTable(sql2, shortName2) }); + + + //join table 2 + var shortName3 = joinExpression1.Parameters[2].Name; + var sqlObj3 = joinQueryable3.ToSql(); + string sql3 = sqlObj3.Key; + UtilMethods.RepairReplicationParameters(ref sql3, sqlObj3.Value.ToArray(), 2, "Join"); + queryable.QueryBuilder.Parameters.AddRange(sqlObj3.Value); + var exp2 = queryable.QueryBuilder.GetExpressionValue(joinExpression2, ResolveExpressType.WhereMultiple); + queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType2, JoinWhere = exp2.GetResultString(), TableName = sqlBuilder.GetPackTable(sql3, shortName3) }); + + //join table 3 + var shortName4 = joinExpression1.Parameters[3].Name; + var sqlObj4 = joinQueryable4.ToSql(); + string sql4 = sqlObj4.Key; + UtilMethods.RepairReplicationParameters(ref sql4, sqlObj4.Value.ToArray(), 3, "Join"); + queryable.QueryBuilder.Parameters.AddRange(sqlObj4.Value); + var exp3 = queryable.QueryBuilder.GetExpressionValue(joinExpression3, ResolveExpressType.WhereMultiple); + queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType3, JoinWhere = exp3.GetResultString(), TableName = sqlBuilder.GetPackTable(sql4, shortName4) }); + + return queryable; + } #endregion public virtual ISugarQueryable UnionAll(params ISugarQueryable[] queryables) where T : class, new() diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs index 041c86af3..32518015c 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace SqlSugar { - public interface ISqlSugarClient: IDisposable + public interface ISqlSugarClient : IDisposable { MappingTableList MappingTables { get; set; } MappingColumnList MappingColumns { get; set; } @@ -25,7 +25,7 @@ namespace SqlSugar AopProvider Aop { get; } ICodeFirst CodeFirst { get; } - + IDbFirst DbFirst { get; } IDbMaintenance DbMaintenance { get; } EntityMaintenance EntityMaintenance { get; set; } @@ -109,12 +109,20 @@ namespace SqlSugar where T2 : class, new(); ISugarQueryable Queryable(ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, ISugarQueryable joinQueryable3, - JoinType joinType1, Expression> joinExpression1, - JoinType joinType2, Expression> joinExpression2) - where T: class, new() - where T2 : class, new() + JoinType joinType1, Expression> joinExpression1, + JoinType joinType2, Expression> joinExpression2) + where T : class, new() + where T2 : class, new() where T3 : class, new(); + ISugarQueryable Queryable(ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, ISugarQueryable joinQueryable3, ISugarQueryable joinQueryable4, + JoinType joinType1, Expression> joinExpression1, + JoinType joinType2, Expression> joinExpression2, + JoinType joinType3, Expression> joinExpression4) + where T : class, new() + where T2 : class, new() + where T3 : class, new() + where T4 : class, new(); ISugarQueryable Queryable(); ISugarQueryable Queryable(ISugarQueryable queryable) where T : class, new(); ISugarQueryable Queryable(string shortName); @@ -150,7 +158,7 @@ namespace SqlSugar Task, List, List, List>> SaveQueuesAsync(bool isTran = true); Task, List, List>> SaveQueuesAsync(bool isTran = true); Task, List>> SaveQueuesAsync(bool isTran = true); - Task> SaveQueuesAsync(bool isTran = true); + Task> SaveQueuesAsync(bool isTran = true); #endregion #region Union diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index a743ffb1a..ce50c97fa 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -320,7 +320,17 @@ namespace SqlSugar { return this.Context.Queryable(joinQueryable1, joinQueryable2, joinQueryable3, joinType1, joinExpression1, joinType2, joinExpression2).With(SqlWith.Null); } - + public ISugarQueryable Queryable(ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, ISugarQueryable joinQueryable3, ISugarQueryable joinQueryable4, + JoinType joinType1, Expression> joinExpression1, + JoinType joinType2, Expression> joinExpression2, + JoinType joinType3, Expression> joinExpression3) + where T : class, new() + where T2 : class, new() + where T3 : class, new() + where T4 : class ,new () + { + return this.Context.Queryable(joinQueryable1, joinQueryable2, joinQueryable3, joinQueryable4, joinType1, joinExpression1, joinType2, joinExpression2,joinType3, joinExpression3).With(SqlWith.Null); + } public ISugarQueryable Queryable() { diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs index a2b372d97..c05619c7f 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs @@ -400,7 +400,14 @@ namespace SqlSugar { return ScopedContext.Queryable(joinQueryable1, joinQueryable2, joinQueryable3,joinType1,joinExpression1,joinType2,joinExpression2); } - + public ISugarQueryable Queryable(ISugarQueryable joinQueryable1, ISugarQueryable joinQueryable2, ISugarQueryable joinQueryable3, ISugarQueryable joinQueryable4, JoinType joinType1, Expression> joinExpression1, JoinType joinType2, Expression> joinExpression2, JoinType joinType3, Expression> joinExpression3) + where T : class, new() + where T2 : class, new() + where T3 : class, new() + where T4 : class, new() + { + return ScopedContext.Queryable(joinQueryable1, joinQueryable2, joinQueryable3, joinQueryable4, joinType1, joinExpression1, joinType2, joinExpression2, joinType3, joinExpression3); + } public ISugarQueryable Queryable() { return ScopedContext.Queryable();