protected override SqlPack Where(MemberExpression expression, SqlPack sqlPack)
        {
            //datetime.now
            if (expression.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换
            {
                var    value         = expression.GetValueOfExpression(sqlPack, false);
                object valueDatetime = sqlPack.SqlDialectProvider.ConvertDateTime(expression.Member, value);
                sqlPack.AddDbParameter(valueDatetime);
                return(sqlPack);
            }
            else if (expression.Member.Name == "Length" && expression.Member.DeclaringType == ResolveConstants.TypeOfString)//长度转换
            {
                MemberExpression memberEx  = expression.Expression as MemberExpression;
                string           tableName = GetTableNameByExpression(memberEx, sqlPack);
                sqlPack.SetTableAlias(tableName);
                string tableAlias = sqlPack.GetTableAlias(tableName);
                if (!string.IsNullOrWhiteSpace(tableAlias))
                {
                    tableAlias += ".";
                }
                string param = tableAlias + memberEx.Member.Name;

                sqlPack += " " + sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.Length, param);
                //sqlPack += ("LEN(");
                //Where(((MemberExpression)expression.Expression), sqlPack);
                //sqlPack += (")");

                return(sqlPack);
            }
            else if (expression.Member.MemberType == MemberTypes.Property || expression.Member.MemberType == MemberTypes.Field)
            {
                object val = null;
                if (expression.TryGetValueOfMemberExpressionWithFormat(sqlPack, out val, false))//如果能获取值就能直接引用变量的值,如 where(p=>p.Id > info.Id)
                {
                    val = val.SqlVerifyFragment2();

                    sqlPack.AddDbParameter(val);

                    return(sqlPack);
                }
                else
                {
                    string tableName = GetTableNameByExpression(expression, sqlPack);
                    sqlPack.SetTableAlias(tableName);                     //expression.Member.DeclaringType.Name
                    string tableAlias = sqlPack.GetTableAlias(tableName); //expression.Member.DeclaringType.Name
                    if (!string.IsNullOrWhiteSpace(tableAlias))
                    {
                        tableAlias += ".";
                    }
                    sqlPack += " " + tableAlias + expression.Member.Name;

                    //sqlPack.HasParamName = true;
                    return(sqlPack);
                }
            }

            sqlPack.AddDbParameter(expression.GetValueOfExpression(sqlPack, false));
            return(sqlPack);
        }
        protected override SqlPack OrderBy(MemberExpression expression, SqlPack sqlPack)
        {
            string tableName = GetTableNameByExpression(expression, sqlPack);

            sqlPack.SetTableAlias(tableName);
            sqlPack += sqlPack.GetTableAlias(tableName) + "." + expression.Member.Name;
            return(sqlPack);
        }
        protected override SqlPack Select(MemberExpression expression, SqlPack sqlPack)
        {
            string tableName = GetTableNameByExpression(expression, sqlPack);

            sqlPack.SetTableAlias(tableName);
            string tableAlias = sqlPack.GetTableAlias(tableName);

            if (!string.IsNullOrWhiteSpace(tableAlias))
            {
                tableAlias += ".";
            }
            sqlPack.SelectFields.Add(tableAlias + expression.Member.Name);
            return(sqlPack);
        }
        protected override SqlPack Select(ParameterExpression expression, SqlPack sqlPack)
        {
            string tableName = expression.GetTableNameByExpression(sqlPack);

            sqlPack.SetTableAlias(tableName);
            string tableAlias = sqlPack.GetTableAlias(tableName);

            if (!string.IsNullOrWhiteSpace(tableAlias))
            {
                tableAlias += ".";
            }
            var colStr = tableAlias + "*";

            sqlPack.SelectFields.Add(colStr);
            return(sqlPack);
        }
        protected override SqlPack Sum(MemberExpression expression, SqlPack sqlPack)
        {
            string tableName = GetTableNameByExpression(expression, sqlPack);

            sqlPack.SetTableAlias(tableName);
            string tableAlias = sqlPack.GetTableAlias(tableName);

            string columnName = expression.Member.Name;

            if (!string.IsNullOrWhiteSpace(tableAlias))
            {
                tableName += " " + tableAlias;
                columnName = tableAlias + "." + expression.Member.Name;
            }

            sqlPack.Sql.AppendFormat("SELECT SUM({0}) FROM {1}", columnName, tableName);
            return(sqlPack);
        }
        public static string GetColumnName(this MemberExpression expression, SqlPack sqlPack)
        {
            if (expression == null)
            {
                return("");
            }
            string tableName = GetTableNameByExpression(expression, sqlPack);

            sqlPack.SetTableAlias(tableName);
            string tableAlias = sqlPack.GetTableAlias(tableName);

            if (!string.IsNullOrWhiteSpace(tableAlias))
            {
                tableAlias += ".";
            }
            string colName = tableAlias + expression.Member.Name;

            return(colName);
        }
        protected override SqlPack Join(MemberExpression expression, SqlPack sqlPack)
        {
            if (expression.Expression != null && expression.Expression is ConstantExpression)
            {
                object value = expression.GetValueOfExpression(sqlPack, false); //expression.Value
                sqlPack.AddDbParameter(value);
                return(sqlPack);
            }

            string tableName = GetTableNameByExpression(expression, sqlPack);

            sqlPack.SetTableAlias(tableName);
            string tableAlias = sqlPack.GetTableAlias(tableName);

            if (!string.IsNullOrWhiteSpace(tableAlias))
            {
                tableAlias += ".";
            }
            sqlPack += " " + tableAlias + expression.Member.Name;

            return(sqlPack);
        }
Example #8
0
        protected override SqlPack Select(NewExpression expression, SqlPack sqlPack)
        {
            //foreach (Expression item in expression.Arguments)
            //{
            //    FluentExpressionSQLProvider.Select(item, sqlPack);
            //}
            var    memberAliasExpList = expression.Members;
            string tableAlias         = "";
            string colStr             = "";
            int    i = 0;

            foreach (Expression item in expression.Arguments)
            {
                var memberAliasExp = memberAliasExpList[i];

                if (item is MemberExpression)
                {
                    MemberExpression memberValueExp = item as MemberExpression;
                    if (memberValueExp != null)
                    {
                        if (memberValueExp.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换
                        {
                            var value = memberValueExp.Expression.GetValueOfExpression(sqlPack);

                            var valueDatetime = sqlPack.SqlDialectProvider.ConvertDateTime(memberValueExp.Member, value);
                            if (memberAliasExp.Name.Equals(memberValueExp.Member.Name, System.StringComparison.InvariantCultureIgnoreCase))
                            {
                                colStr = valueDatetime.Text;
                            }
                            else
                            {
                                colStr = valueDatetime.Text + " " + sqlPack.ColumnAsAliasString + memberAliasExp.Name;
                            }
                        }
                        else if (memberValueExp.Member.Name == "Length" && memberValueExp.Member.DeclaringType == ResolveConstants.TypeOfString)//长度转换
                        {
                            MemberExpression memberEx  = memberValueExp.Expression as MemberExpression;
                            string           tableName = memberEx.GetTableNameByExpression(sqlPack);
                            sqlPack.SetTableAlias(tableName);
                            tableAlias = sqlPack.GetTableAlias(tableName);
                            if (!string.IsNullOrWhiteSpace(tableAlias))
                            {
                                tableAlias += ".";
                            }
                            string param = tableAlias + memberEx.Member.Name;

                            colStr = sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.Length, param);

                            if (memberAliasExp.Name.Equals(memberEx.Member.Name, System.StringComparison.InvariantCultureIgnoreCase))
                            {
                                //colStr = tableAlias + memberEx.Member.Name;
                            }
                            else
                            {
                                colStr += " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name;
                            }
                        }
                        else if (memberValueExp.Member.MemberType == MemberTypes.Field) //局部变量
                        {
                            var value = memberValueExp.Expression.GetValueOfExpression(sqlPack);

                            var memberInfoType  = memberValueExp.Member.GetPropertyOrFieldType();
                            var memberInfoValue = memberValueExp.Member.GetPropertyOrFieldValue(value);
                            memberInfoValue = sqlPack.SqlDialectProvider.FormatValue(memberInfoValue, true);//format
                            if (memberInfoType == ResolveConstants.TypeOfDateTime)
                            {
                                colStr = sqlPack.SqlDialectProvider.ConvertSqlValue(memberInfoValue, memberInfoType);
                            }
                            else
                            {
                                colStr = memberInfoValue.ToString();
                            }

                            if (!string.IsNullOrEmpty(memberAliasExp.Name) && !string.IsNullOrEmpty(colStr))
                            {
                                colStr += " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name;
                            }
                        }
                        else
                        {
                            string tableName = memberValueExp.GetTableNameByExpression(sqlPack);

                            sqlPack.SetTableAlias(tableName);              //memberValueExp.Member.DeclaringType.Name
                            tableAlias = sqlPack.GetTableAlias(tableName); //memberValueExp.Member.DeclaringType.Name
                            if (!string.IsNullOrWhiteSpace(tableAlias))
                            {
                                tableAlias += ".";
                            }
                            if (memberAliasExp.Name.Equals(memberValueExp.Member.Name, System.StringComparison.InvariantCultureIgnoreCase))
                            {
                                colStr = tableAlias + memberValueExp.Member.Name;
                            }
                            else
                            {
                                colStr = tableAlias + memberValueExp.Member.Name + " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name;
                            }
                        }

                        sqlPack.SelectFields.Add(colStr);
                    }
                }
                else
                {
                    sqlPack.CurrentColAlias = memberAliasExp.Name;
                    FluentExpressionSQLProvider.Select(item, sqlPack);
                    sqlPack.CurrentColAlias = null;
                }
                i++;
            }
            return(sqlPack);
        }
        //public static object GetValueOfExpressionWithoutFormat(this Expression body )
        //{
        //    if (body == null)
        //    {
        //        return string.Empty;
        //    }
        //    if (body is ConstantExpression)
        //    {
        //        return ((ConstantExpression)body).Value;
        //    }
        //    if (body is MemberExpression)
        //    {
        //        var member = ((MemberExpression)body);

        //        var value = GetValueOfMemberExpression(member);
        //        Type typeOfValue = null;
        //        if (value != null)
        //        {
        //            typeOfValue = value.GetType();
        //        }

        //        return (value);

        //    }
        //    if (body is UnaryExpression)
        //    {
        //        return GetValueOfExpressionWithoutFormat(((UnaryExpression)body).Operand);
        //    }
        //    if (body is NewExpression)
        //    {
        //        var args = ((NewExpression)body).Arguments;
        //        //判断Select设置值  Select<UserInfo>(u => new {  DT3=new DateTime(2015,10,11) }).
        //        if (args.Count > 0)
        //        {
        //            return GetValueOfExpressionWithoutFormat(args[0]);
        //        }
        //        //foreach (var item in ((NewExpression)body).Arguments)
        //        //{
        //        //    GetValueOfExpression(item, sqlpack);
        //        //}
        //    }
        //    //if (body is BinaryExpression)
        //    //{
        //    //    var binary = body as BinaryExpression;
        //    //    if (binary.Right.GetValueOfExpressionWithoutFormat() == null && (binary.NodeType == ExpressionType.Equal || binary.NodeType == ExpressionType.NotEqual))
        //    //    {
        //    //        return string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack),
        //    //        ConvertExpressionTypeToString(binary.NodeType, true),
        //    //        "NULL");
        //    //    }
        //    //    else
        //    //    {
        //    //        return string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack),
        //    //       ConvertExpressionTypeToString(binary.NodeType),
        //    //       GetValueOfExpression(binary.Right, sqlpack));
        //    //    }

        //    //}
        //    //if (body is MethodCallExpression)
        //    //{
        //    //    var method = body as MethodCallExpression;

        //    //    return MethodCallFluentExpressionSQL.GetMethodResult(method, sqlpack);

        //    //}
        //    if (body is LambdaExpression)
        //    {
        //        return GetValueOfExpressionWithoutFormat(((LambdaExpression)body).Body);
        //    }
        //    return "";
        //}

        public static object GetValueOfExpression(this Expression body, SqlPack sqlpack, bool needFormat = true)
        {
            if (body == null)
            {
                return(string.Empty);
            }
            if (body is ConstantExpression)
            {
                return(FormatValue(((ConstantExpression)body).Value, sqlpack, needFormat));
            }
            if (body is MemberExpression)
            {
                var member = ((MemberExpression)body);


                if (member.Member.MemberType == MemberTypes.Property)
                {
                    if (member.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换
                    {
                        if (member.Member == ResolveConstants.PropertyInfo_DateTime_Now ||
                            member.Member == ResolveConstants.PropertyInfo_DateTime_UtcNow ||
                            member.Member == ResolveConstants.PropertyInfo_DateTime_Today)//只能转换为常量的SQL 字符
                        {
                            object valueDatetime = sqlpack.SqlDialectProvider.ConvertDateTime(member.Member, null);
                            return(valueDatetime);
                        }
                    }



                    string tableName = GetTableNameByExpression(member, sqlpack);
                    sqlpack.SetTableAlias(tableName);
                    string tableAlias = sqlpack.GetTableAlias(tableName);
                    if (!string.IsNullOrWhiteSpace(tableAlias))
                    {
                        tableAlias += ".";
                    }
                    return(tableAlias + member.Member.Name);

                    //return member.Member.Name;
                }
                var  value       = GetValueOfMemberExpression(member);
                Type typeOfValue = null;
                if (value != null)
                {
                    typeOfValue = value.GetType();
                }

                if (IsListType(typeOfValue))
                {
                    var valueList = value as IEnumerable;

                    var sb = new StringBuilder();
                    foreach (var item in value as IEnumerable)
                    {
                        sb.AppendFormat("{0},", FormatValue(item, sqlpack, needFormat));
                    }
                    if (sb.Length == 0)
                    {
                        return("");
                    }
                    return(sb.Remove(sb.Length - 1, 1).ToString());
                }
                else
                {
                    return(FormatValue(value, sqlpack, needFormat));
                }
            }
            if (body is UnaryExpression)
            {
                return(GetValueOfExpression(((UnaryExpression)body).Operand, sqlpack, needFormat));
            }
            if (body is NewExpression)
            {
                var args = ((NewExpression)body).Arguments;
                //判断Select设置值  Select<UserInfo>(u => new {  DT3=new DateTime(2015,10,11) }).
                if (args.Count > 0)
                {
                    return(GetValueOfExpression(args[0], sqlpack, needFormat));
                }
                //foreach (var item in ((NewExpression)body).Arguments)
                //{
                //    GetValueOfExpression(item, sqlpack);
                //}
            }
            if (body is BinaryExpression)
            {
                var binary = body as BinaryExpression;
                if (binary.Right.GetValueOfExpression(sqlpack, needFormat) == null && (binary.NodeType == ExpressionType.Equal || binary.NodeType == ExpressionType.NotEqual))
                {
                    return(string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack, needFormat),
                                         ConvertExpressionTypeToString(binary.NodeType, true),
                                         "NULL"));
                }
                else
                {
                    return(string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack, needFormat),
                                         ConvertExpressionTypeToString(binary.NodeType),
                                         GetValueOfExpression(binary.Right, sqlpack, needFormat)));
                }
            }
            if (body is MethodCallExpression)
            {
                var method = body as MethodCallExpression;

                return(MethodCallFluentExpressionSQL.GetMethodResult(method, sqlpack, needFormat));

                //return string.Format("({0} IN ({1}))", GetValueOfExpression(method.Arguments[0], sqlpack),
                //    GetValueOfExpression(method.Object, sqlpack));
            }
            if (body is LambdaExpression)
            {
                return(GetValueOfExpression(((LambdaExpression)body).Body, sqlpack, needFormat));
            }
            return("");
        }