Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 public SqlMember(object value, SqlMemberType memberType, List <SqlParameter> paramList)
 {
     Value      = value;
     MemberType = memberType;
     ParamList  = paramList;
 }