From 8c9c3703ee938f561565698447397c9520b1083e Mon Sep 17 00:00:00 2001 From: skx <610262374@qq.com> Date: Tue, 29 Dec 2020 13:55:46 +0800 Subject: [PATCH] Subquery join --- .../SqlServerTest/Demo/Demo1_Queryable.cs | 4 +- .../ResolveItems/MapperExpressionResolve.cs | 2 +- .../Subquery/Items/SubInnerJoin.cs | 62 +++++++++++++++++++ .../Subquery/Items/SubWhere.cs | 13 ++-- .../Subquery/Items/SubWhereIF.cs | 3 +- .../ExpressionsToSql/Subquery/SubTools.cs | 1 + Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 7 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs index b50886cea..424b4e2ee 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo1_Queryable.cs @@ -125,7 +125,9 @@ namespace OrmTest var list2 = db.Queryable().Where(it => SqlFunc.Subqueryable() .LeftJoin((i,y)=>i.ItemId==y.ItemId) - .Where((i,y) => y.ItemId== it.Id).Any() + .InnerJoin((i,z) => i.ItemId == z.ItemId) + .Where(i=>i.ItemId==1) + .Any() ).ToList(); Console.WriteLine("#### Subquery End ####"); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MapperExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MapperExpressionResolve.cs index f97c6888b..07df7a68d 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MapperExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MapperExpressionResolve.cs @@ -205,7 +205,7 @@ namespace SqlSugar } void ThrowTrue(bool isError) { - Check.Exception(isError, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "不支持表达式" + expression.ToString())); + Check.Exception(isError, ErrorMessage.GetThrowMessage(expression.ToString() + "no support", "不支持表达式" + expression.ToString()+ " 1.检查当前表达式中的别名是否与Mapper中的一致 2.目前只支持 1对1 Mapper下的 Where ")); } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs new file mode 100644 index 000000000..02b7d26a1 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubInnerJoin.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SubInnerJoin : ISubOperation + { + + public bool HasWhere + { + get; set; + } + + public string Name + { + get { return "InnerJoin"; } + } + + public Expression Expression + { + get; set; + } + + public int Sort + { + get + { + return 301; + } + } + + public ExpressionContext Context + { + get; set; + } + + public string GetValue(Expression expression) + { + var exp = expression as MethodCallExpression; + var argExp = exp.Arguments[0]; + var name =this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters[0].Name); + var parameter = (argExp as LambdaExpression).Parameters[1]; + Context.InitMappingInfo(parameter.Type); + var tableName= Context.GetTranslationTableName(parameter.Type.Name, true); + var joinString =string.Format(" {2} INNER JOIN {1} {0} ", + this.Context.GetTranslationColumnName(parameter.Name), + tableName, + this.Context.JoinIndex==0?name:""); + 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++; + + //result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); + return result; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs index e640f6666..7e26b7445 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs @@ -7,7 +7,7 @@ using System.Text.RegularExpressions; namespace SqlSugar { - public class SubWhere: ISubOperation + public class SubWhere : ISubOperation { public bool HasWhere { @@ -34,14 +34,14 @@ namespace SqlSugar public ExpressionContext Context { - get;set; + get; set; } public string GetValue(Expression expression) { var exp = expression as MethodCallExpression; - var argExp= exp.Arguments[0]; - var result= "WHERE "+SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); + var argExp = exp.Arguments[0]; + var result = "WHERE " + SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); var regex = @"^WHERE (\@Const\d+) $"; @@ -59,8 +59,9 @@ namespace SqlSugar return result; } - var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name)+UtilConstants.Dot; - result = result.Replace(selfParameterName,SubTools.GetSubReplace(this.Context)); + var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; + if (this.Context.JoinIndex == 0) + result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhereIF.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhereIF.cs index 1e266e1de..95dff686b 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhereIF.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhereIF.cs @@ -55,7 +55,8 @@ namespace SqlSugar var argExp = exp.Arguments[1]; var result = "WHERE " + SubTools.GetMethodValue(Context, argExp, ResolveExpressType.WhereMultiple); ; var selfParameterName = Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; - result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); + if (this.Context.JoinIndex == 0) + result = result.Replace(selfParameterName, SubTools.GetSubReplace(this.Context)); return result; } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index 041d5f2be..879700a0e 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -17,6 +17,7 @@ namespace SqlSugar new SubWhere(){ Context=Context }, new SubWhereIF(){ Context=Context }, new SubLeftJoin(){ Context=Context }, + new SubInnerJoin(){ Context=Context }, new SubAnd(){ Context=Context }, new SubAndIF(){ Context=Context }, new SubAny(){ Context=Context }, diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 762fa2a19..30bc8131c 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -92,6 +92,7 @@ +