private SqlMember ResolveMethodEndsWith(MethodCallExpression exp) { StringBuilder builder = new StringBuilder(); List <SqlParameter> paramList = new List <SqlParameter>(); if (exp.Object != null) { SqlMember sqlMember = Resolve(exp.Object); builder.Append(sqlMember.Value); if (sqlMember.ParamList != null) { paramList.AddRange(sqlMember.ParamList); } } builder.Append(" LIKE "); if (exp.Arguments != null) { foreach (var item in exp.Arguments) { SqlMember sqlMember = Resolve(item); builder.Append(sqlMember.Value); if (sqlMember.ParamList != null) { paramList.AddRange(sqlMember.ParamList); } } } builder.Append(" +'%' "); return(new SqlMember(builder.ToString(), SqlMemberType.None, paramList)); }
private SqlMember VisitMemberAccess(MemberExpression exp) { LogUtil.Info(exp.Member.Name); SqlMemberType sqlMemberType = default(SqlMemberType); List <SqlParameter> paramList = new List <SqlParameter>(); object value = null; if (IsNotParameterExpression(exp)) { var memberValue = Expression.Lambda(exp).Compile().DynamicInvoke(); sqlMemberType = SqlMemberType.Value; var memberValueType = memberValue.GetType(); if (memberValueType.IsArray || memberValueType.IsGenericType) { foreach (var item in (IEnumerable)memberValue) { paramList.Add(GetSqlParameter(item, item.GetType())); } value = string.Concat("(", string.Join(",", paramList.Select(m => m.ParameterName)), ")"); } else { var sqlParameter = GetSqlParameter(memberValue, memberValue.GetType()); paramList.Add(sqlParameter); value = sqlParameter.ParameterName; } } else { if (exp.Member.Name == "Length") { SqlMember memberSqlMember = Resolve(exp.Expression); value = $"LEN({memberSqlMember.Value})"; sqlMemberType = SqlMemberType.Key; if (memberSqlMember.ParamList != null) { paramList.AddRange(memberSqlMember.ParamList); } } if (exp.Member.Name == "Count") { throw new NotSupportedException("Count"); } else { value = exp.Member.Name; sqlMemberType = SqlMemberType.Key; } } return(new SqlMember(value, sqlMemberType, paramList)); }
private SqlMember ResolveMethodTrim(MethodCallExpression exp) { StringBuilder builder = new StringBuilder("RTRIM(LTRIM("); List <SqlParameter> paramList = new List <SqlParameter>(); if (exp.Object != null) { SqlMember sqlMember = Resolve(exp.Object); builder.Append(sqlMember.Value); if (sqlMember.ParamList != null) { paramList.AddRange(sqlMember.ParamList); } } builder.Append(")"); return(new SqlMember(builder.ToString(), SqlMemberType.Key, paramList)); }
private SqlMember ResolveMethodContains(MethodCallExpression exp) { var rightExpType = exp.Arguments[0].NodeType; LogUtil.Debug($"RightType:{rightExpType}"); Expression leftExp = exp.Object ?? exp.Arguments[1]; Expression rightExp = null; if (new ExpressionType[] { ExpressionType.MemberAccess, ExpressionType.Constant }.Contains(rightExpType)) { rightExp = exp.Arguments[0]; } else { rightExp = Expression.Lambda(exp.Arguments[0]); } StringBuilder builder = new StringBuilder(); List <SqlParameter> paramList = new List <SqlParameter>(); SqlMember leftSqlMember = Resolve(leftExp); SqlMember rightSqlMEember = Resolve(rightExp); if (leftSqlMember.ParamList != null && leftSqlMember.ParamList.Count > 1)//是个数组或者集合 { builder.AppendFormat("{0} IN {1}", rightSqlMEember.Value, leftSqlMember.Value); } else if (rightSqlMEember.ParamList != null && rightSqlMEember.ParamList.Count > 1) { builder.AppendFormat("{0} IN {1}", leftSqlMember.Value, rightSqlMEember.Value); } else { builder.AppendFormat(" {0} LIKE '%'+{1}+'%' ", leftSqlMember.Value, rightSqlMEember.Value); } if (leftSqlMember.ParamList != null) { paramList.AddRange(leftSqlMember.ParamList); } if (rightSqlMEember.ParamList != null) { paramList.AddRange(rightSqlMEember.ParamList); } return(new SqlMember(builder.ToString(), SqlMemberType.None, paramList)); }
private SqlMember AppendSqlMember(SqlMember leftSqlMember, ExpressionType expType, SqlMember rightSqlMember) { SqlMemberType memberType = SqlMemberType.None; StringBuilder builder = new StringBuilder(); List <SqlParameter> paramList = new List <SqlParameter>(); if (leftSqlMember.ParamList != null) { paramList.AddRange(leftSqlMember.ParamList); } if (rightSqlMember.ParamList != null) { paramList.AddRange(rightSqlMember.ParamList); } if (expType == ExpressionType.Coalesce) { builder.AppendFormat("ISNULL({0},{1})", leftSqlMember.MemberType == SqlMemberType.Value ? rightSqlMember.Value : leftSqlMember.Value, leftSqlMember.MemberType == SqlMemberType.Value ? leftSqlMember.Value : rightSqlMember.Value); memberType = SqlMemberType.Key; } else { if (leftSqlMember.MemberType == rightSqlMember.MemberType && leftSqlMember.MemberType == SqlMemberType.None) { builder.AppendFormat("({0} {1} {2})", leftSqlMember.Value, ResolveExpressionType(expType), rightSqlMember.Value); } else if (leftSqlMember.MemberType == SqlMemberType.None || rightSqlMember.MemberType == SqlMemberType.None) { builder.AppendFormat("({0} {1} {2}) ", leftSqlMember.MemberType == SqlMemberType.None ? leftSqlMember.Value : leftSqlMember.Value + "=1", ResolveExpressionType(expType), rightSqlMember.MemberType == SqlMemberType.None ? rightSqlMember.Value : rightSqlMember.Value + "=1"); } else { builder.AppendFormat("({0} {1} {2})", leftSqlMember.Value, ResolveExpressionType(expType), rightSqlMember.Value); } } return(new SqlMember(builder.ToString(), memberType, paramList)); }
public SqlMember Resolve(Expression exp) { if (exp == null) { return(default(SqlMember)); } LogUtil.Debug($"NodeType:{exp.NodeType.ToString()}"); SqlMember sqlMember = default(SqlMember); switch (exp.NodeType) { case ExpressionType.Negate: case ExpressionType.NegateChecked: case ExpressionType.Not: case ExpressionType.Convert: case ExpressionType.ConvertChecked: case ExpressionType.ArrayLength: case ExpressionType.Quote: case ExpressionType.TypeAs: sqlMember = this.VisitUnary((UnaryExpression)exp); break; case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.Divide: case ExpressionType.Modulo: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.Coalesce: case ExpressionType.ArrayIndex: case ExpressionType.RightShift: case ExpressionType.LeftShift: case ExpressionType.ExclusiveOr: sqlMember = this.VisitBinary((BinaryExpression)exp); break; case ExpressionType.TypeIs: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.Conditional: sqlMember = this.VisitConditional((ConditionalExpression)exp); break; case ExpressionType.Constant: sqlMember = this.VisitConstant((ConstantExpression)exp); break; case ExpressionType.Parameter: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.MemberAccess: sqlMember = VisitMemberAccess((MemberExpression)exp); break; case ExpressionType.Call: sqlMember = VisitMethodCall((MethodCallExpression)exp); break; case ExpressionType.Lambda: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.New: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.NewArrayInit: case ExpressionType.NewArrayBounds: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.Invoke: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.MemberInit: throw new NotSupportedException(exp.NodeType.ToString()); case ExpressionType.ListInit: throw new NotSupportedException(exp.NodeType.ToString()); default: throw new NotSupportedException(exp.NodeType.ToString()); } return(sqlMember); }