diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index 5c7b0bb88..66078ea6e 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -450,14 +450,14 @@ namespace SqlSugar { "AddMilliseconds",DateType.Millisecond} }; - private static bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod) + private bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod) { return !isValidNativeMethod && express.Method.DeclaringType.Namespace.IsIn("System.Linq", "System.Collections.Generic") && methodName == "Contains"; } - private static bool IsSubMethod(MethodCallExpression express, string methodName) + private bool IsSubMethod(MethodCallExpression express, string methodName) { - return SubTools.SubItems.Any(it => it.Name == methodName) && express.Object != null && express.Object.Type.Name == "Subqueryable`1"; + return SubTools.SubItems(this.Context).Any(it => it.Name == methodName) && express.Object != null && express.Object.Type.Name == "Subqueryable`1"; } private void CheckMethod(MethodCallExpression expression) { diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubAction.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubAction.cs index 60f885320..3a7af1bab 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubAction.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubAction.cs @@ -8,9 +8,11 @@ namespace SqlSugar { public interface ISubOperation { + ExpressionContext Context { get; set; } string Name { get; } - string GetValue(ExpressionContext context, Expression expression); + string GetValue(Expression expression); int Sort { get; } Expression Expression { get; set; } + } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs index 30450ceea..e173876ca 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs @@ -26,12 +26,17 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public ExpressionContext Context + { + get;set; + } + + public string GetValue(Expression expression) { var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; - var result = "AND " + SubTools.GetMethodValue(context, argExp, ResolveExpressType.WhereMultiple); - var selfParameterName = context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; + var result = "AND " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.WhereMultiple); + var selfParameterName = this.Context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name) + UtilConstants.Dot; result = result.Replace(selfParameterName, string.Empty); return result; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs index 7e65b4f83..926791737 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubAny : ISubOperation { + public ExpressionContext Context + { + get;set; + } + public Expression Expression { get;set; @@ -29,7 +34,7 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public string GetValue(Expression expression) { return "EXISTS"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs index 18a04aefd..9ddcf1c46 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs @@ -29,7 +29,12 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public ExpressionContext Context + { + get;set; + } + + public string GetValue(Expression expression) { return "SELECT"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs index 162eae527..7d2832817 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs @@ -28,12 +28,18 @@ namespace SqlSugar return 300; } } - public string GetValue(ExpressionContext context, Expression expression) + + public ExpressionContext Context + { + get;set; + } + + public string GetValue(Expression expression) { var exp = expression as MethodCallExpression; var resType = exp.Method.ReturnType; var name = resType.GetGenericArguments().First().Name; - return "FROM "+context.GetTranslationTableName(name, true); + return "FROM "+this.Context.GetTranslationTableName(name, true); } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs index 3b0b445aa..a770cd10c 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubLeftBracket : ISubOperation { + public ExpressionContext Context + { + get;set; + } + public Expression Expression { get;set; @@ -29,7 +34,7 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public string GetValue(Expression expression) { return "("; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs index a3e8e1672..b08db473d 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubNotAny : ISubOperation { + public ExpressionContext Context + { + get;set; + } + public Expression Expression { get; set; @@ -29,7 +34,7 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public string GetValue(Expression expression) { return "NOT EXISTS"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs index 450a99424..cb8f22287 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubRightBracket : ISubOperation { + public ExpressionContext Context + { + get;set; + } + public Expression Expression { get;set; @@ -29,7 +34,7 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public string GetValue(Expression expression) { return ")"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs index 2b8d4471f..9606dc608 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs @@ -30,10 +30,15 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression = null) + public ExpressionContext Context + { + get;set; + } + + public string GetValue(Expression expression = null) { var exp = expression as MethodCallExpression; - return SubTools.GetMethodValue(context, exp.Arguments[0],ResolveExpressType.FieldSingle); + return SubTools.GetMethodValue(this.Context, exp.Arguments[0],ResolveExpressType.FieldSingle); } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs index 3338b3972..b34236c43 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubSelectDefault : ISubOperation { + public ExpressionContext Context + { + get;set; + } + public Expression Expression { get;set; @@ -28,7 +33,7 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public string GetValue(Expression expression) { return "*"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs new file mode 100644 index 000000000..dbb4427e8 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubTop : ISubOperation + { + public ExpressionContext Context + { + get;set; + } + + public Expression Expression + { + get;set; + } + + public string Name + { + get + { + return "Top"; + } + } + + public int Sort + { + get + { + if (this.Context is SqlServerExpressionContext) + { + return 150; + } + else + { + return 450; + } + } + } + + + public string GetValue(Expression expression) + { + if (this.Context is SqlServerExpressionContext) + { + return "TOP 1"; + } + else { + return "limit 0,1"; + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs index 6092c96d8..81046283a 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs @@ -26,12 +26,17 @@ namespace SqlSugar } } - public string GetValue(ExpressionContext context, Expression expression) + public ExpressionContext Context + { + 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 selfParameterName =context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name)+UtilConstants.Dot; + 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,string.Empty); return result; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 8b41e655a..ec0ace212 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -52,19 +52,25 @@ namespace SqlSugar var isubList = this.allMethods.Select(exp => { var methodName = exp.Method.Name; - var item = SubTools.SubItems.First(s => s.Name == methodName); + var items = SubTools.SubItems(this.context); + var item = items.First(s => s.Name == methodName); if (item is SubWhere && hasWhere == false) { hasWhere = true; } - else if(item is SubWhere) + else if (item is SubWhere) { - item = SubTools.SubItems.First(s => s is SubAnd); + item = items.First(s => s is SubAnd); } + item.Context = this.context; item.Expression = exp; return item; }).ToList(); isubList.Insert(0, new SubBegin()); + if (isubList.Any(it => it is SubSelect)) + { + isubList.Add(new SubTop() { Context=this.context }); + } if (isubList.Any(it => it is SubAny || it is SubNotAny)) { isubList.Add(new SubLeftBracket()); @@ -74,7 +80,7 @@ namespace SqlSugar isubList = isubList.OrderBy(it => it.Sort).ToList(); List result = isubList.Select(it => { - return it.GetValue(this.context, it.Expression); + return it.GetValue(it.Expression); }).ToList(); return result; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index a3259cbf0..41e55a287 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -8,24 +8,28 @@ namespace SqlSugar { public class SubTools { - public static List SubItems = new List() + public static List SubItems(ExpressionContext Context) { - new SubSelect(), - new SubWhere(), - new SubAnd(), - new SubAny(), - new SubNotAny(), - new SubBegin(), - new SubFromTable() - }; - public static string GetMethodValue(ExpressionContext context,Expression item,ResolveExpressType type) + return new List() + { + new SubSelect() { Context=Context }, + new SubWhere(){ Context=Context }, + new SubAnd(){ Context=Context }, + new SubAny(){ Context=Context }, + new SubNotAny(){ Context=Context }, + new SubBegin(){ Context=Context }, + new SubFromTable(){ Context=Context } + }; + } + + public static string GetMethodValue(ExpressionContext context, Expression item, ResolveExpressType type) { var newContext = context.GetCopyContext(); newContext.MappingColumns = context.MappingColumns; newContext.MappingTables = context.MappingTables; newContext.IgnoreComumnList = context.IgnoreComumnList; - newContext.Resolve(item,type); + newContext.Resolve(item, type); context.Index = newContext.Index; context.ParameterIndex = newContext.ParameterIndex; return newContext.Result.GetResultString(); diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index e6ef2a60f..8afe05208 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -82,6 +82,7 @@ +