From 77259b214b25ce5eb44287a922dbe35c8c6e9b66 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 26 Feb 2017 20:37:02 +0800 Subject: [PATCH] - --- .../LambdaExpressionsProvider.cs | 12 - .../ResolveExpress/Constant.cs | 123 ------ .../ResolveExpress/Expressions.cs | 305 --------------- .../ResolveExpress/Main.cs | 360 ------------------ .../ResolveExpress/Method.cs | 274 ------------- .../ResolveExpress/Models.cs | 66 ---- .../ResolveExpress/Property.cs | 32 -- .../ResolveExpress/ResolveFieldName.cs | 84 ---- .../QueryableProvider/QueryableAccessory.cs | 8 +- .../SqlBuilder}/SqlServerExpressionContext.cs | 4 +- .../SqlServerLambadaQueryBuilder.cs | 11 - .../SqlServerLambdaExpressions.cs | 12 - SqlSugar/Interface/ILambdaExpressions.cs | 12 +- SqlSugar/SqlSugar.csproj | 12 +- 14 files changed, 18 insertions(+), 1297 deletions(-) delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/LambdaExpressionsProvider.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Constant.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Expressions.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Main.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Method.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Models.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Property.cs delete mode 100644 SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/ResolveFieldName.cs rename SqlSugar/Databases/SqlServer/{LambdaExpressions => Db/SqlBuilder}/SqlServerExpressionContext.cs (88%) delete mode 100644 SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerLambadaQueryBuilder.cs delete mode 100644 SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerLambdaExpressions.cs diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/LambdaExpressionsProvider.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/LambdaExpressionsProvider.cs deleted file mode 100644 index 16a6eca90..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/LambdaExpressionsProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace SqlSugar -{ - public partial class LambdaExpressionsProvider : ILambdaExpressions - { - public SqlSugarClient Context { get; set; } - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Constant.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Constant.cs deleted file mode 100644 index f8d822cb2..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Constant.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -namespace SqlSugar -{ - //局部类:拉姆达解析公用常量 - internal partial class ResolveExpress - { - /// - /// 解析bool类型用到的字典 - /// - public static List ConstantBoolDictionary = new List() - { - new ExpressBoolModel(){ Key=Guid.NewGuid(), OldValue="True", Type=PubConst.StringType}, - new ExpressBoolModel(){ Key=Guid.NewGuid(), OldValue="False",Type=PubConst.StringType}, - new ExpressBoolModel(){ Key=Guid.NewGuid(), OldValue="True",Type=PubConst.BoolType}, - new ExpressBoolModel(){ Key=Guid.NewGuid(), OldValue="False",Type=PubConst.BoolType} - - }; - /// - /// 字段名解析错误 - /// - public const string FileldErrorMessage = "OrderBy、GroupBy、In、Min和Max等操作不是有效拉姆达格式 ,正确格式 it=>it.name 。"; - /// - /// 拉姆达解析错误 - /// - public const string ExpToSqlError= @"拉姆达解析出错,不是有效的函数,找不到合适函数你可以使用这种字符串写法.Where(""date>dateadd(@date)"",new{date=DateTime.Now}), - 支持的函数有(请复制到本地查看,数量比较多): - db.Queryable().Where(it => it.field == parValue.ObjToString()); - db.Queryable().Where(it => it.field == parValue.ObjToDate()); - db.Queryable().Where(it => it.field == parValue.ObjToInt()) - db.Queryable().Where(it => it.field == parValue.ObjToDecimal()) - db.Queryable().Where(it => it.field == parValue.ObjToMoney()) - db.Queryable().Where(it => it.field == parValue.Trim()) - db.Queryable().Where(it => it.field == parValue.ToString()) - db.Queryable().Where(it => it.field == Convert.ToXXX(parValue)) - db.Queryable().Where(it => it.field.Contains(parValue)) - db.Queryable().Where(it => it.field.StartsWith(parValue)) - db.Queryable().Where(it => it.field.EndsWith(parValue)) - db.Queryable().Where(it => !string.IsNullOrEmpty(it.parValue)) - db.Queryable().Where(it => arrayOrList.Contains(it.parValue)) - db.Queryable().Where(it => it.field.Equals(it.parValue)) - db.Queryable().Where(it => it.field.Length>10) - db.Queryable().Where(c => c.field == parValue.ToLower()).ToList(); - db.Queryable().Where(c => c.field == parValue.ToUpper()).ToList(); - "; - /// - /// 运算符错误 - /// - public const string OperatorError = "拉姆达解析出错:不支持{0}此种运算符查找!"; - - /// - /// 拉姆达解析唯一标识 - /// - public static object ExpErrorUniqueKey = Guid.NewGuid(); - - /// - /// 拉姆达函数错误 - /// - public const string ExpMethodError = "拉姆达表达式中的函数用法不正确,正确写法 it=>it.name.{0}(参数) ,不支持的写法it=> 参数.{0}(it.name)。"; - - /// - /// 拉姆达函数错误2 - /// - public const string ExpMethodError2 = "拉姆达表达式中的函数用法不正确,正确写法 it=>it.name==参数.{0} ,不支持的写法it=>it.name.{0}==参数。"; - - /// - /// 表达式不支持解析BlockExpression - /// - public const string ExpBlockExpression = "表达式不支持解析BlockExpression,错误信息:"; - - /// - /// 表达式不支解析ConditionalExpression - /// - public const string ExpConditionalExpression = "表达式不支解析ConditionalExpression,错误信息:"; - - /// - /// 拉姆达表达式内不支持new对象 - /// - public const string ExpNew = "拉姆达表达式内不支持new对象,请提取变量后在赋值,错误信息:"; - - /// - /// 不支持对象或属性 - /// - public const string ExpNoSupportObjectOrAttr = "拉姆达解析不支持{0}对象,或该{1}的属性。"; - - /// - /// 不支持属性扩展方法 - /// - public const string ExpNoSupportAttExtMethod = "不支持属性扩展方法{0}。"; - } - - - //局部类:Select表达式对象解析公用常量 - internal partial class ResolveSelect { - - /// - /// 解析对象不能为null - /// - public const string ExpSelectValueIsNull = "解析对象不能为null。"; - - /// - ///Select中不支持函数 - /// - public const string ExpNoSupportMethod = "Select中不支持函数{0}。"; - - /// - /// Select中不支持变量的运算 - /// - public const string ExpNoSupportOperation = "Select中不支持变量的运算。"; - - /// - /// 不支持外部传参 - /// - public static string ExpNoSupportOutPars = "Select中的拉姆达表达式,不支持外部传参数,目前支持的写法: Where(\"1=1\",new {id=1}).Select(it=>{ id=\"@id\".ObjToInt()} 。"; - - /// - /// 不支持ToString - /// - public static string ExpNoSupportToString = "Select中不支持ToString函数,请使用ObjectToString。"; - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Expressions.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Expressions.cs deleted file mode 100644 index c04ec3280..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Expressions.cs +++ /dev/null @@ -1,305 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Linq.Expressions; -using System.Text.RegularExpressions; -namespace SqlSugar -{ - //局部类:拉姆达解析分类处理 - internal partial class ResolveExpress - { - private string UnaryExpression(Expression exp, ref MemberType type) - { - UnaryExpression ue = ((UnaryExpression)exp); - var mex = ue.Operand; - bool? isComparisonOperator = null; - var isNot = ue.NodeType==ExpressionType.Not; - if (mex.NodeType == ExpressionType.MemberAccess && isNot) - { - isComparisonOperator = false; - } - var cse = CreateSqlElements(mex, ref type, false,isComparisonOperator); - if (type == MemberType.Value && isNot && cse.IsIn("1","0")) - { - cse = cse == "1" ? "0" : "1"; - - }else if (type == MemberType.None && isNot) - { - cse = " NOT " + cse; - } - return cse; - } - - private bool UnderNodeTypeIsConstantExpression(MemberExpression exp) - { - while (exp.Expression != null) - { - if (exp != null && exp.Expression != null) - { - if (exp.Expression is MemberExpression) - { - exp = (MemberExpression)exp.Expression; - } - else - { - - break; - } - } - } - return exp.Expression is ConstantExpression; - } - - private string MemberExpression(ref Expression exp, ref MemberType type, bool? isComparisonOperator) - { - - MemberExpression me = ((MemberExpression)exp); - var isPro = (me.Member.Name == "Length") && me.Member.DeclaringType == PubConst.StringType; - var proIsField = false; - if (isPro) proIsField = me.Expression != null && !UnderNodeTypeIsConstantExpression(me); - if (proIsField==false&&(me.Expression == null || me.Expression.NodeType != ExpressionType.Parameter)) - { - type = MemberType.Value; - object dynInv = null; - - if (isPro) - { - exp = me.Expression; - dynInv = CreateSqlElements(exp, ref type, true); - } - else { - GetMemberValue(ref exp, me, ref dynInv); - } - if (isPro)return GetProMethod(me.Member.Name,dynInv.ObjToString(),false); - if (dynInv!=null&&dynInv.GetType() == PubConst.BoolType) - { - dynInv = ConstantBoolDictionary.Where(it => it.Type == PubConst.BoolType).Single(it => it.OldValue.ToLower() == dynInv.ObjToString().ToLower()).NewValue; - } - if (dynInv == null) return null; - else - return dynInv.ToString(); - } - else if (isComparisonOperator == false) - { - return "(" + me.Member.Name + "=1)"; - } - else - { - if (Type == ResolveExpressType.WhereMultiple) - { - type = MemberType.Key; - var dbName = exp.ToString(); - if (isPro) return GetProMethod(me.Member.Name, dbName, true); - return dbName; - } - //single T - string name = me.Member.Name; - if (isPro) - { - name = ((me.Expression) as MemberExpression).Member.Name; - } - type = MemberType.Key; - if (isPro) return GetProMethod(me.Member.Name, name, true); - return name; - } - } - - private static void GetMemberValue(ref Expression exp, MemberExpression me, ref object dynInv) - { - // var dynInv = Expression.Lambda(exp).Compile().DynamicInvoke();原始写法性能极慢,下面写法性能提高了几十倍 - // var dynInv= Expression.Lambda(me.Expression as ConstantExpression).Compile().DynamicInvoke(); - SetMemberValueToDynInv(ref exp, me, ref dynInv); - if (dynInv == ExpErrorUniqueKey)//特殊情况走原始写法 - { - dynInv = Expression.Lambda(exp).Compile().DynamicInvoke(); - if (dynInv != null && dynInv.GetType().IsClass) - { - dynInv = Expression.Lambda(me).Compile().DynamicInvoke(); - } - } - } - - private static string ConstantExpression(Expression exp, ref MemberType type, bool? isComparisonOperator) - { - type = MemberType.Value; - ConstantExpression ce = ((ConstantExpression)exp); - if (ce.Value == null) - return "null"; - else if (ce.Value.ToString().IsIn("True", "False"))//是bool值 - { - var ceType = ce.Value.GetType(); - var ceValue = ce.Value.ToString(); - if (isComparisonOperator==true) - { - var ceNewValue = ConstantBoolDictionary.Single(it => it.Type == ceType && it.OldValue.ToLower() == ceValue.ToLower()); - return ceNewValue.NewValue; - } - else - { - var ceNewValue = ConstantBoolDictionary.Single(it => it.Type == ceType && it.OldValue.ToLower() == ceValue.ToLower()); - return ceNewValue.Key.ToString(); - } - } - else - { - return ce.Value.ToString(); - } - } - - private string MethodCallExpression(Expression exp, ref MemberType type, bool isTure) - { - MethodCallExpression mce = (MethodCallExpression)exp; - string methodName = mce.Method.Name; - if (methodName == "Contains") - { - return Contains(methodName, mce, isTure); - } - else if (methodName == "StartsWith") - { - return StartsWith(methodName, mce, isTure); - } - else if (methodName == "EndsWith") - { - return EndWith(methodName, mce, isTure); - } - else if (methodName == "ToString") - { - type = MemberType.Value; - return MethodToString(methodName, mce, ref type); - } - else if (methodName == "IsNullOrEmpty") - { - type = MemberType.Value; - return IsNullOrEmpty(methodName, mce, isTure); - } - else if (methodName == "Equals") - { - return Equals(methodName, mce); - } - else - { - type = MemberType.Value; - return ParMethodTo(methodName, mce, ref type); - } - } - - private string BinaryExpression(Expression exp) - { - var expression = exp as BinaryExpression; - var isComparisonOperator = - expression.NodeType != ExpressionType.And && - expression.NodeType != ExpressionType.AndAlso && - expression.NodeType != ExpressionType.Or && - expression.NodeType != ExpressionType.OrElse; - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var leftIsDateTime = expression.Left.Type.ToString().Contains("System.DateTime"); - var rightIsDateTime = expression.Right.Type.ToString().Contains("System.DateTime"); - var left = CreateSqlElements(expression.Left, ref leftType, true, isComparisonOperator); - var right = CreateSqlElements(expression.Right, ref rightType, true, isComparisonOperator); - var oper = GetOperator(expression.NodeType); - var isKeyOperValue = leftType == MemberType.Key && rightType == MemberType.Value; - var isValueOperKey = rightType == MemberType.Key && leftType == MemberType.Value; - #region 处理 null - - if (isKeyOperValue && right.IsGuid() && ConstantBoolDictionary.Any(it => it.Key.ToString() == right)) - { - right = ConstantBoolDictionary.Single(it => it.Key.ToString() == right).NewValue; - } - if (isValueOperKey && ConstantBoolDictionary.Any(it => it.Key.ToString() == left)) - { - left = ConstantBoolDictionary.Single(it => it.Key.ToString() == left).NewValue; - } - - if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "=") - { - var oldLeft = AddParas(ref left, right); - return string.Format(" ({0} is null ) ", oldLeft); - } - else if (isKeyOperValue & (right == "null" || right == null) && oper.Trim() == "<>") - { - var oldLeft = AddParas(ref left, right); - return string.Format(" ({0} is not null ) ", oldLeft); - } - else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "=") - { - return string.Format(" ({0} is null ) ", right); - } - else if (isValueOperKey & (left == "null" || left == null) && oper.Trim() == "<>") - { - return string.Format(" ({0} is not null ) ", right); - } - #endregion - else if (isKeyOperValue) - { - object parValue = null; - if (leftIsDateTime && right != null && right.IsDate()) - { - parValue = Convert.ToDateTime(right); - } - else - { - parValue = right; - } - if (left.Contains("(")) - { - return string.Format(" ({0} {1} {2}) ",left, oper, right.ToSqlValue()); - } - else - { - var oldLeft = AddParas(ref left, parValue); - return string.Format(" ({0} {1} " + this.ParSymbol + "{2}) ",this.SqlBuilder.GetTranslationColumnName(oldLeft), oper, left); - } - } - else if (isValueOperKey) - { - object parValue = null; - if (rightIsDateTime && left != null && left.IsDate()) - { - parValue = Convert.ToDateTime(left); - } - else - { - parValue = left; - } - if (right.Contains("(")) - { - return string.Format(" ({0} {1} {2}) ", left.ToSqlValue(), oper, right); - } - else - { - var oldRight = AddParasReturnRight(parValue, ref right); - return string.Format("( " + this.ParSymbol + "{0} {1} {2} )", right, oper, this.SqlBuilder.GetTranslationColumnName(oldRight)); - } - } - else if (leftType == MemberType.Value && rightType == MemberType.Value) - { - var isAndOr = oper.ObjToString().IsIn("AND","OR"); - if (isAndOr) - { - return string.Format("( {0} {1} {2} )", left, oper, right); - } - else - { - return string.Format("( '{0}' {1} '{2}' )", left, oper, right); - } - } - else - { - return string.Format("( {0} {1} {2} )", left, oper, right); - } - } - - private string LambdaExpression(Expression exp) - { - LambdaExpression lambda = exp as LambdaExpression; - var expression = lambda.Body; - MemberType EleType = MemberType.None; - if (expression.NodeType == ExpressionType.MemberAccess) { - return "("+((MemberExpression)expression).Member.Name+"=1)"; - } - return CreateSqlElements(expression, ref EleType, true); - } - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Main.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Main.cs deleted file mode 100644 index 08beba946..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Main.cs +++ /dev/null @@ -1,360 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using System.Reflection; -using System.Text.RegularExpressions; -namespace SqlSugar -{ - /// - /// ** 描述:拉姆达解析类 - /// ** 创始时间:2015-7-20 - /// ** 修改时间:2016-9-26 - /// ** 作者:sunkaixuan - /// ** qq:610262374 - /// ** 使用说明:使用请注名作者 - /// - internal partial class ResolveExpress - { - public SqlSugarClient Context { get; set; } - private ISqlBuilder SqlBuilder { get; set; } - private ResolveExpress() { } - private string ParSymbol { get; set; } - public ResolveExpress(SqlSugarClient context) - { - this.Context = context; - this.SqlBuilder = context.SqlBuilder; - this.ParSymbol = context.SqlBuilder.SqlParameterKeyWord; - } - - /// - /// 解析拉姆达 - /// - /// 区分相同参数名的索引号 - public ResolveExpress(int sameIndex = 1) - { - this.SameIndex = sameIndex; - } - - public string SqlWhere = null; - public ResolveExpressType Type = ResolveExpressType.WhereSingle; - public List Paras = new List(); - private int SameIndex = 1; - private SqlSugarClient DB; - - - /// - /// 解析表达式 - /// - /// 当前解析对象 - /// 要解析的表达式 - /// 数据库访问对象 - public void ResolveExpression(Expression exp) - { - DB = this.Context; - //初始化表达式 - Init(this, exp); - } - - public string GetLeftString(Expression exp) - { - var reval = Regex.Match(exp.ToString(), @"\((.+?)\).+").Groups[1].Value; - return reval; - } - public string[] GetLeftArray(Expression exp) - { - var reval = GetLeftString(exp).Split(','); - return reval; - } - - /// - /// 初始化表达式 - /// - /// - /// - private void Init(ResolveExpress re, Expression exp) - { - ResolveExpress.MemberType type = ResolveExpress.MemberType.None; - this.SqlWhere = string.Format(" {1} {0} ", re.CreateSqlElements(exp, ref type, true), Context.SqlBuilder.LambadaQueryBuilder.WhereInfos.Count == 0 ? "WHERE" : "AND"); - //还原bool值 - foreach (var item in ConstantBoolDictionary) - { - if (this.SqlWhere.IsValuable()) - { - this.SqlWhere = this.SqlWhere.Replace(item.Key.ToString(), item.ConditionalValue); - } - } - - } - - /// - /// 递归解析表达式路由计算 - /// - /// - private string CreateSqlElements(Expression exp, ref MemberType type, bool isTure, bool? isComparisonOperator = null) - { - //主入口 - if (exp is LambdaExpression) - { - return LambdaExpression(exp); - } - else if (exp is BinaryExpression) - { - return BinaryExpression(exp); - } - else if (exp is BlockExpression) - { - throw new SqlSugarException(ExpBlockExpression + exp.ToString()); - } - else if (exp is ConditionalExpression) - { - throw new SqlSugarException(ExpConditionalExpression + exp.ToString()); - } - else if (exp is MethodCallExpression) - { - return MethodCallExpression(exp, ref type, isTure); - } - else if (exp is ConstantExpression) - { - return ConstantExpression(exp, ref type, isComparisonOperator); - } - else if (exp is MemberExpression) - { - return MemberExpression(ref exp, ref type, isComparisonOperator); - } - else if (exp is UnaryExpression) - { - return UnaryExpression(exp, ref type); - } - else if (exp != null && exp.NodeType.IsIn(ExpressionType.New, ExpressionType.NewArrayBounds, ExpressionType.NewArrayInit)) - { - throw new SqlSugarException(ExpNew + exp.ToString()); - } - return null; - } - - /// - /// 将解析值赋给dynInv - /// - /// - /// - /// - private static void SetMemberValueToDynInv(ref Expression exp, MemberExpression me, ref object dynInv) - { - var conExp = me.Expression as ConstantExpression; - var fieldInfo = me.Member as System.Reflection.FieldInfo; - if (conExp != null && fieldInfo != null) - { - dynInv = (fieldInfo).GetValue((me.Expression as ConstantExpression).Value); - if (fieldInfo.FieldType.IsEnum) - { - dynInv = Convert.ToInt64(Enum.ToObject(fieldInfo.FieldType, dynInv)); - } - } - else - { - - var memberInfos = new Stack(); - - // "descend" toward's the root object reference: - while (exp is MemberExpression) - { - var memberExpr = exp as MemberExpression; - memberInfos.Push(memberExpr.Member); - if (memberExpr.Expression == null) - { - if (memberExpr.Member.MemberType == MemberTypes.Property) - { - PropertyInfo pro = (PropertyInfo)memberExpr.Member; - dynInv = pro.GetValue(memberExpr.Member, null); - if (dynInv != null && dynInv.GetType().IsClass) - { - var fieldName = me.Member.Name; - var proInfo = dynInv.GetType().GetProperty(fieldName); - if (proInfo != null) - { - dynInv = proInfo.GetValue(dynInv, null); - } - var fieInfo = dynInv.GetType().GetField(fieldName); - if (fieInfo != null) - { - dynInv = fieInfo.GetValue(dynInv); - } - if (fieInfo == null && proInfo == null) - { - throw new SqlSugarException(string.Format(ExpNoSupportObjectOrAttr, dynInv.GetType().FullName, dynInv.GetType().FullName)); - } - } - return; - } - else if (memberExpr.Member.MemberType == MemberTypes.Field) - { - FieldInfo field = (FieldInfo)memberExpr.Member; - dynInv = field.GetValue(memberExpr.Member); - if (dynInv != null && dynInv.GetType().IsClass) - { - var fieldName = me.Member.Name; - var proInfo = dynInv.GetType().GetProperty(fieldName); - if (proInfo != null) - { - dynInv = proInfo.GetValue(dynInv, null); - } - var fieInfo = dynInv.GetType().GetField(fieldName); - if (fieInfo != null) - { - dynInv = fieInfo.GetValue(dynInv); - } - if (fieInfo == null && proInfo == null) - { - throw new SqlSugarException(string.Format(ExpNoSupportObjectOrAttr, dynInv.GetType().FullName, dynInv.GetType().FullName)); - } - } - return; - } - - } - if (memberExpr.Expression == null) - { - dynInv = ExpErrorUniqueKey; - return; - } - exp = memberExpr.Expression; - } - - // fetch the root object reference: - var constExpr = exp as ConstantExpression; - if (constExpr == null) - { - dynInv = ExpErrorUniqueKey; - return; - } - var objReference = constExpr.Value; - - // "ascend" back whence we came from and resolve object references along the way: - while (memberInfos.Count > 0) // or some other break condition - { - var mi = memberInfos.Pop(); - if (mi.MemberType == MemberTypes.Property) - { - var objProp = objReference.GetType().GetProperty(mi.Name); - if (objProp == null) - { - dynInv = ExpErrorUniqueKey; - return; - } - objReference = objProp.GetValue(objReference, null); - } - else if (mi.MemberType == MemberTypes.Field) - { - var objField = objReference.GetType().GetField(mi.Name); - if (objField == null) - { - dynInv = ExpErrorUniqueKey; - return; - } - objReference = objField.GetValue(objReference); - } - } - dynInv = objReference; - } - } - - /// - /// 添加参数 - /// - /// - /// - /// - private string AddParas(ref string left, object right) - { - string oldLeft = left; - left = left + SameIndex; - SameIndex++; - if (Type != ResolveExpressType.WhereSingle) - { - left = left.Replace(".", "_"); - } - if (right == null) - { - this.Paras.Add(new SqlParameter(this.ParSymbol + left, DBNull.Value)); - } - else - { - this.Paras.Add(new SqlParameter(this.ParSymbol + left, right)); - } - return oldLeft; - } - - /// - /// 添加参数并返回右边值 - /// - /// - /// - /// - private string AddParasReturnRight(object left, ref string right) - { - string oldRight = right; - right = right + SameIndex; - SameIndex++; - if (Type != ResolveExpressType.WhereSingle) - { - right = right.Replace(".", "_"); - } - if (left == null) - { - this.Paras.Add(new SqlParameter(this.ParSymbol + right, DBNull.Value)); - } - else - { - this.Paras.Add(new SqlParameter(this.ParSymbol + right, left)); - } - return oldRight; - } - - /// - /// 根据条件生成对应的sql查询操作符 - /// - /// - /// - private string GetOperator(ExpressionType expressiontype) - { - switch (expressiontype) - { - case ExpressionType.And: - case ExpressionType.AndAlso: - return " AND "; - case ExpressionType.Equal: - return " ="; - case ExpressionType.GreaterThan: - return " >"; - case ExpressionType.GreaterThanOrEqual: - return ">="; - case ExpressionType.LessThan: - return "<"; - case ExpressionType.LessThanOrEqual: - return "<="; - case ExpressionType.NotEqual: - return "<>"; - case ExpressionType.Or: - case ExpressionType.OrElse: - return " OR "; - case ExpressionType.Add: - case ExpressionType.AddChecked: - return "+"; - case ExpressionType.Subtract: - case ExpressionType.SubtractChecked: - return "-"; - case ExpressionType.Divide: - return "/"; - case ExpressionType.Multiply: - case ExpressionType.MultiplyChecked: - return "*"; - default: - throw new SqlSugarException(string.Format(OperatorError + expressiontype)); - } - } - - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Method.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Method.cs deleted file mode 100644 index bfb26b2fa..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Method.cs +++ /dev/null @@ -1,274 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Linq.Expressions; -using System.Collections; - -namespace SqlSugar -{ - //局部类:解析函数 - internal partial class ResolveExpress - { - /// - /// 是否相等 - /// - /// - /// - /// - private string Equals(string methodName, MethodCallExpression mce) { - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var left = CreateSqlElements(mce.Object, ref leftType,true); - var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString(); - Check.Exception(leftType == MemberType.Value, string.Format(ExpMethodError,methodName)); - var oldLeft = AddParas(ref left,right); - return string.Format("({0} = " + this.ParSymbol + "{1})", this.SqlBuilder.GetTranslationColumnName(oldLeft), left); - } - - /// - /// 拉姆达StartsWith函数处理 - /// - /// - /// - /// - /// - private string StartsWith(string methodName, MethodCallExpression mce, bool isTure) - { - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var left = CreateSqlElements(mce.Object, ref leftType,true); - var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString(); - Check.Exception(leftType == MemberType.Value, string.Format(ExpMethodError, methodName)); - var oldLeft = AddParas(ref left, right + '%'); - return string.Format("({0} {1} LIKE " + this.ParSymbol + "{2})", this.SqlBuilder.GetTranslationColumnName(oldLeft), null, left); - } - - /// - /// 拉姆达EndWith函数处理 - /// - /// - /// - /// - /// - private string EndWith(string methodName, MethodCallExpression mce, bool isTure) - { - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var left = CreateSqlElements(mce.Object, ref leftType,true); - var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString(); - Check.Exception(leftType == MemberType.Value, string.Format(ExpMethodError, methodName)); - var oldLeft = AddParas(ref left, '%' + right); - return string.Format("({0} {1} LIKE " + this.ParSymbol + "{2})", this.SqlBuilder.GetTranslationColumnName(oldLeft), null, left); - } - - /// - /// 拉姆达Contains函数处理 - /// - /// - /// - /// - /// - private string Contains(string methodName, MethodCallExpression mce, bool isTure) - { - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var left = CreateSqlElements(mce.Object, ref leftType,true); - var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString(); - if (left.IsCollectionsList() || right.IsStringArray() || right.IsEnumerable()) - { - object containsValue = null; - string fieldName = ""; - if (left.IsCollectionsList()) - { - fieldName = right; - MemberExpression mbx = ((MemberExpression)mce.Object); - Expression exp = mce.Object; - SetMemberValueToDynInv(ref exp, mbx, ref containsValue); - - } - else - { - MemberExpression mbx = ((MemberExpression)mce.Arguments[0]); - Expression exp = mce.Arguments[0]; - SetMemberValueToDynInv(ref exp, mbx, ref containsValue); - fieldName = CreateSqlElements(mce.Arguments[1], ref rightType,true); - } - List inArray = new List(); - foreach (var item in (IEnumerable)containsValue) - { - inArray.Add(item.ObjToString()); - } - if (inArray.Count == 0) - { - return (" (1=2) "); - } - var inValue = inArray.ToArray().ToJoinSqlInVals(); - return string.Format("({0} IN ({1}))", this.SqlBuilder.GetTranslationColumnName(fieldName), inValue); - } - else if (mce.Arguments.Count == 2) { //两个值 - //object containsValue = null; - //MemberExpression mbx = ((MemberExpression)mce.Arguments[0]); - //Expression exp = mce.Arguments[0]; - //SetMemberValueToDynInv(ref exp, mbx, ref containsValue); - //var fieldName = CreateSqlElements(mce.Arguments[1], ref rightType); - //return null; - throw new SqlSugarException("请将数组提取成变量,不能直接写在表达式中。"); - } - else - { - Check.Exception(leftType == MemberType.Value, string.Format(ExpMethodError, methodName)); - var oldLeft = AddParas(ref left, '%' + right + '%'); - return string.Format("({0} {1} LIKE " + this.ParSymbol + "{2})", this.SqlBuilder.GetTranslationColumnName(oldLeft), null, left); - } - } - - /// - /// 非空验证 - /// - /// - /// - /// - /// - private string IsNullOrEmpty(string methodName, MethodCallExpression mce, bool isTure) - { - MemberType leftType = MemberType.None; - MemberType rightType = MemberType.None; - var isConstant = mce.Arguments.First().NodeType == ExpressionType.Constant; - var left = CreateSqlElements(mce.Object, ref leftType,true); - var right = mce.Arguments[0].NodeType.IsIn(ExpressionType.Constant, ExpressionType.MemberAccess) ? CreateSqlElements(mce.Arguments[0], ref rightType, true) : Expression.Lambda(mce.Arguments[0]).Compile().DynamicInvoke().ObjToString(); - if (right == "null") - { - right = ""; - } - if (isConstant) - { - var oldLeft = AddParas(ref left, right); - if (isTure) - { - return string.Format("(" + this.ParSymbol + "{0} is null OR " + this.ParSymbol + "{0}='' )", left); - } - else - { - return string.Format("(" + this.ParSymbol + "{0} is not null AND " + this.ParSymbol + "{0}<>'' )", left); - } - } - else - { - if (isTure) - { - if (rightType == MemberType.Key) - { - return string.Format("({0} is null OR {0}='' )", right.ToSqlFilter()); - } - else - { - return string.Format("('{0}' is null OR '{0}'='' )", right.ToSqlFilter()); - } - } - else - { - if (rightType == MemberType.Key) - { - return string.Format("({0} is not null AND {0}<>'' )", right.ToSqlFilter()); - } - else - { - - return string.Format("('{0}' is not null AND '{0}'<>'' )", right.ToSqlFilter()); - } - } - - } - } - - /// - /// 参数函数 - /// - /// - /// - /// - /// - private string ParMethodTo(string methodName, MethodCallExpression mce, ref MemberType type) - { - //参数函数 - MemberType rightType = MemberType.None; - object right =null; - if (mce.Arguments.IsValuable() && !methodName.IsIn("AddDays", "AddYears", "AddMonths")) - { - right = CreateSqlElements(mce.Arguments[0], ref rightType, true); - } - else { - right = CreateSqlElements(mce.Object, ref rightType, true); - } - Check.Exception(rightType != MemberType.Value, string.Format(ExpMethodError2, methodName)); - string value = string.Empty; - if (mce.Arguments.IsValuable()) - { - value = right.ToString(); - } - else - { - value = MethodToString(methodName, mce, ref type); ; - } - if (methodName.IsIn("AddDays", "AddYears", "AddMonths")) - { - if (value.IsValuable()) - { - var parValue = CreateSqlElements(mce.Arguments[0], ref rightType, true).ObjToInt(); - switch (methodName) - { - case "AddDays": value = value.ObjToDate().AddDays(parValue).ObjToString(); break; - case "AddYears": value = value.ObjToDate().AddYears(parValue).ObjToString(); break; - case "AddMonths": value = value.ObjToDate().AddMonths(parValue).ObjToString(); break; - - } - } - return value; - } - if (methodName == "ToDateTime" || methodName == "ObjToDate") - { - return Convert.ToDateTime(value).ToString(); - } - else if (methodName.StartsWith("ToInt")) - { - return Convert.ToInt32(value).ToString(); - } - else if (methodName.StartsWith("Trim")) - { - return (value.ObjToString()).Trim(); - } - else if (methodName.StartsWith("ObjTo")) - { - return value; - } - else if (methodName == "ToLower") { - if (value == null) return value; - else - return value.ToLower(); - } - else if (methodName == "ToUpper") - { - if (value == null) return value; - else - return value.ToUpper(); - } - else - { - throw new SqlSugarException("不支持当前函数:" + methodName + "\r\n" + ResolveExpress.ExpToSqlError); - } - } - - /// - /// 拉姆达ToString函数处理 - /// - /// - /// - /// - /// - private string MethodToString(string methodName, MethodCallExpression mce, ref MemberType type) - { - return CreateSqlElements(mce.Object, ref type,true); - } - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Models.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Models.cs deleted file mode 100644 index 710281194..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Models.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SqlSugar -{ - //局部类:解析用到的实体 - internal partial class ResolveExpress - { - /// - /// 拉姆达成员类型 - /// - public enum MemberType - { - None = 0, - Key = 1, - Value = 2 - } - /// - /// 用来处理bool类型的实体 - /// - public class ExpressBoolModel - { - /// - /// 唯一标识 - /// - public Guid Key { get; set; } - /// - /// 数据类型 - /// - public Type Type { get; set; } - /// - /// 原始值 - /// - public string OldValue { get; set; } - /// - /// 处事后的值 - /// - public string NewValue - { - get - { - if (Type == PubConst.BoolType) - { - return Convert.ToBoolean(OldValue) ? "1" : "0"; - } - else - { - return OldValue.ToString(); - } - } - } - /// - /// 处理后的运算对象 - /// - public string ConditionalValue - { - get - { - return Convert.ToBoolean(OldValue) ? "(1=1)" : "(1=2)"; - } - } - } - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Property.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Property.cs deleted file mode 100644 index 53dc2a14f..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/Property.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SqlSugar -{ - //局部类:解析属性 - internal partial class ResolveExpress - { - private string GetProMethod(string methodName, string value, bool isField) - { - switch (methodName) - { - case "Length": - return ProLength(value, isField); - default: throw new SqlSugarException(string.Format(ExpNoSupportAttExtMethod, methodName)); - } - } - private string ProLength(string value, bool isField) - { - if (isField) - { - return string.Format("LEN({0})", this.SqlBuilder.GetTranslationColumnName(value)); - } - else - { - return string.Format("{0}", value.ObjToString().Length); - } - } - } -} diff --git a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/ResolveFieldName.cs b/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/ResolveFieldName.cs deleted file mode 100644 index 206bcb773..000000000 --- a/SqlSugar/Abstract/LambdaExpressionsProvider/ResolveExpress/ResolveFieldName.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Linq.Expressions; - -namespace SqlSugar -{ - //局部类 解析字段名 - internal partial class ResolveExpress - { - /// - /// 获取拉姆达表达式的字段值 - /// - /// - /// 数据库访问对象 - /// - public string GetExpressionRightField(Expression exp, SqlSugarClient db) - { - DB = db; - string reval = ""; - LambdaExpression lambda = exp as LambdaExpression; - var isConvet = lambda.Body.NodeType.IsIn(ExpressionType.Convert); - var isMember = lambda.Body.NodeType.IsIn(ExpressionType.MemberAccess); - if (!isConvet && !isMember) - { - throw new SqlSugarException(FileldErrorMessage); - } - try - { - if (isConvet) - { - var memberExpr =((UnaryExpression)lambda.Body).Operand as MemberExpression; - reval= memberExpr.Member.Name; - } - else//isMember - { - reval= (lambda.Body as MemberExpression).Member.Name; - } - } - catch (Exception) - { - throw new SqlSugarException(FileldErrorMessage); - } - return reval; - } - - /// - /// 获取拉姆达表达式的字段值多个T模式 - /// - /// - /// 数据库访问对象 - /// - public string GetExpressionRightFieldByNT(Expression exp, SqlSugarClient db) - { - DB = db; - string reval = ""; - LambdaExpression lambda = exp as LambdaExpression; - var isConvet = lambda.Body.NodeType.IsIn(ExpressionType.Convert); - var isMember = lambda.Body.NodeType.IsIn(ExpressionType.MemberAccess); - if (!isConvet && !isMember) - { - throw new SqlSugarException(FileldErrorMessage); - } - try - { - if (isConvet) - { - var memberExpr = ((UnaryExpression)lambda.Body).Operand as MemberExpression; - reval= memberExpr.ToString(); - } - else//isMember - { - reval= lambda.Body.ToString(); - } - } - catch (Exception) - { - throw new SqlSugarException(FileldErrorMessage); - } - return reval; - } - } -} diff --git a/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs b/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs index 17961297b..283e2c6ef 100644 --- a/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs +++ b/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs @@ -29,11 +29,9 @@ namespace SqlSugar { var sqlBuilder = context.SqlBuilder; var items = sqlBuilder.LambadaQueryBuilder; - ResolveExpress resolveExpress = new ResolveExpress(context); - items.WhereIndex = items.WhereIndex + 100; - resolveExpress.ResolveExpression(expression); - this.AddPars(resolveExpress.Paras, context); - items.WhereInfos.Add(resolveExpress.SqlWhere); + ILambdaExpressions resolveExpress = new SqlServerExpressionContext(expression,type); + _Pars.AddRange(resolveExpress.Parameters); + items.WhereInfos.Add(resolveExpress.Result.ToString()); } protected void Where(string whereString, object whereObj, SqlSugarClient context) where T : class, new() diff --git a/SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerExpressionContext.cs b/SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerExpressionContext.cs similarity index 88% rename from SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerExpressionContext.cs rename to SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerExpressionContext.cs index 33ce04cd4..f3ca2b63c 100644 --- a/SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerExpressionContext.cs +++ b/SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerExpressionContext.cs @@ -9,12 +9,14 @@ using System.Threading.Tasks; namespace SqlSugar { - public partial class SqlServerExpressionContext : ExpressionContext + public partial class SqlServerExpressionContext : ExpressionContext, ILambdaExpressions { + public SqlSugarClient Context { get; set; } public SqlServerExpressionContext(Expression expression, ResolveExpressType resolveType) : base(expression, resolveType) { base.DbMehtods = new SqlServerMethod(); } + } public partial class SqlServerMethod : DefaultDbMethod, IDbMethods { diff --git a/SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerLambadaQueryBuilder.cs b/SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerLambadaQueryBuilder.cs deleted file mode 100644 index aa7ed0aa6..000000000 --- a/SqlSugar/Databases/SqlServer/Db/SqlBuilder/SqlServerLambadaQueryBuilder.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SqlSugar -{ - public class SqlServerLambadaQueryBuilder: LambadaQueryBuilder - { - } -} diff --git a/SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerLambdaExpressions.cs b/SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerLambdaExpressions.cs deleted file mode 100644 index 8b851f813..000000000 --- a/SqlSugar/Databases/SqlServer/LambdaExpressions/SqlServerLambdaExpressions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SqlSugar -{ - public class SqlServerLambdaExpressions : LambdaExpressionsProvider - { - - } -} diff --git a/SqlSugar/Interface/ILambdaExpressions.cs b/SqlSugar/Interface/ILambdaExpressions.cs index 8cc14c071..b6e40397a 100644 --- a/SqlSugar/Interface/ILambdaExpressions.cs +++ b/SqlSugar/Interface/ILambdaExpressions.cs @@ -1,13 +1,23 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; - namespace SqlSugar { public partial interface ILambdaExpressions { SqlSugarClient Context { get; set; } + IDbMethods DbMehtods { get; set; } + Expression Expression { get; set; } + int Index { get; set; } + int ParameterIndex { get; set; } + List Parameters { get; set; } + ExpressionResult Result { get; set; } + string SqlParameterKeyWord { get; } + string GetaMppingColumnsName(string name); + string GetAsString(string fieldName, string fieldValue); + void Resolve(); } } diff --git a/SqlSugar/SqlSugar.csproj b/SqlSugar/SqlSugar.csproj index efaa1f26d..3bd665039 100644 --- a/SqlSugar/SqlSugar.csproj +++ b/SqlSugar/SqlSugar.csproj @@ -54,14 +54,6 @@ - - - - - - - - @@ -89,9 +81,7 @@ - - @@ -100,7 +90,7 @@ - +