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 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(object value, SqlMemberType memberType, List <SqlParameter> paramList) { Value = value; MemberType = memberType; ParamList = paramList; }