diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs index dbbc7e61e..ddc950ee2 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs @@ -258,9 +258,9 @@ namespace OrmTest var list2 = db.Queryable().Where(it => SqlFunc.Subqueryable() - .LeftJoin((i,y)=>i.ItemId==y.ItemId) + .LeftJoin((i,y)=>i.ItemId==y.ItemId&&2==2) .InnerJoin((i,y,z) => i.ItemId == z.ItemId) - .Where((i ,y)=>i.ItemId==1) + .Where((i ,y,z)=>i.ItemId==z.ItemId) .Any() ).ToList(); ; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs index daaf819c4..afe847314 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs @@ -50,11 +50,11 @@ namespace SqlSugar var joinString =string.Format(" {2} INNER JOIN {1} {0} ", this.Context.GetTranslationColumnName(parameter.Name), tableName, - this.Context.JoinIndex==1?name:""); + null); var result = joinString+ "ON " + SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); //var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; this.Context.JoinIndex++; - + new SubSelect() { Context=this.Context}.SetShortName(exp, "+"); //result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftJoin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftJoin.cs index 4302d2c36..dcbe48638 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftJoin.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftJoin.cs @@ -50,11 +50,11 @@ namespace SqlSugar var joinString =string.Format(" {2} LEFT JOIN {1} {0} ", this.Context.GetTranslationColumnName(parameter.Name), tableName, - this.Context.JoinIndex==1?name:""); + null); var result = joinString+ "ON " + SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); //var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; this.Context.JoinIndex++; - + new SubSelect() { Context = this.Context }.SetShortName(exp, "+"); //result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs index f11b95ed7..ac24cbfa3 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs @@ -60,7 +60,7 @@ namespace SqlSugar return result; } - private void SetShortName(MethodCallExpression exp, string result) + public void SetShortName(MethodCallExpression exp, string result) { if (exp.Arguments[0] is LambdaExpression && result.IsContainsIn("+", "-")) { diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 2227f3950..dcdd2f1a2 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -96,14 +96,33 @@ namespace SqlSugar { GetSubAs(sqlItems, asItems); } - if (this.context.CurrentShortName.HasValue()) + if (this.context.CurrentShortName.HasValue()) { GetShortName(sqlItems); } - var sql = string.Join(UtilConstants.Space, sqlItems); + var sql = ""; + + if (sqlItems.Count(it => IsJoin(it)) > 1) + { + var index = sqlItems.IndexOf(sqlItems.First(x=>IsJoin(x))); + var joinitems = sqlItems.Where(it => IsJoin(it)).ToList(); + joinitems.Reverse(); + var items = sqlItems.Where(it => !IsJoin(it)).ToList(); + items.InsertRange(index, joinitems); + sql = string.Join(UtilConstants.Space, items); + } + else + { + sql = string.Join(UtilConstants.Space, sqlItems); + } return this.context.DbMehtods.Pack(sql); } + private static bool IsJoin(string it) + { + return it.StartsWith(" INNER JOIN") || it.StartsWith(" LEFT JOIN"); + } + private void GetSubAs(List sqlItems, List asItems) { for (int i = 0; i < sqlItems.Count; i++)