Пример #1
0
 public OrderExpression <T> ThenByDescending <T2>(Expression <Func <T2, object> > expression)
 {
     SqlPack += " ,";
     FluentExpressionSQLProvider.OrderBy(expression.Body, SqlPack);
     SqlPack += " DESC";
     return(this);
 }
Пример #2
0
        public OrderExpression <T> ThenBy(Expression <Func <T, object> > expression)
        {
            SqlPack += " ,";
            FluentExpressionSQLProvider.OrderBy(expression.Body, SqlPack);

            return(this);
        }
Пример #3
0
        protected override SqlPack Having(BinaryExpression expression, SqlPack sqlPack)
        {
            if (HasBeginInOwnLogic(expression, sqlPack))
            {
                sqlPack += " (";
            }


            FluentExpressionSQLProvider.Where(expression.Left, sqlPack);
            int signIndex = sqlPack.Length;

            FluentExpressionSQLProvider.Where(expression.Right, sqlPack);
            int sqlLength = sqlPack.Length;

            if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack, true);
            }
            else
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack);
            }

            if (HasEndInOwnLogic(expression, sqlPack))
            {
                sqlPack += ")";
            }
            return(sqlPack);
        }
Пример #4
0
 protected override SqlPack OrderBy(NewExpression expression, SqlPack sqlPack)
 {
     foreach (Expression item in expression.Arguments)
     {
         FluentExpressionSQLProvider.OrderBy(item, sqlPack);
     }
     return(sqlPack);
 }
Пример #5
0
        public GroupByExpression <T> Having <T2>(Expression <Func <T2, bool> > expression)
        {
            SqlPack += " HAVING ";
            SqlPack.CurrentWhereExpression = expression.Body;

            FluentExpressionSQLProvider.Having(expression.Body, SqlPack);

            return(this);
        }
Пример #6
0
        private static void Contains(MethodCallExpression expression, SqlPack sqlPack)
        {
            MethodInfo method = expression.Method;

            if (method.DeclaringType == typeof(String) || method.DeclaringType == typeof(string))
            {
                if (expression.Object != null)
                {
                    FluentExpressionSQLProvider.Where(expression.Object, sqlPack);
                }
                string result = "";

                var column = expression.Arguments[0].GetValueOrColumnName(sqlPack);

                result = sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.Contains, column);

                sqlPack += " LIKE ";

                sqlPack.CurrentDbFunctionResult = result;
            }
            else
            {
                var declaringType = method.DeclaringType;
                // typeof(IList).IsAssignableFrom(declaringType) || typeof(IEnumerable).IsAssignableFrom(declaringType) || (declaringType.IsGenericType && typeof(ICollection<>).MakeGenericType(declaringType.GetGenericArguments()).IsAssignableFrom(declaringType))
                if (declaringType.IsListType())
                {
                    var memberExp = expression.Object;
                    FluentExpressionSQLProvider.Where(expression.Arguments[0], sqlPack);
                    sqlPack += " IN ";
                    FluentExpressionSQLProvider.In(memberExp, sqlPack);
                }
                else if (method.IsStatic && declaringType == typeof(System.Linq.Enumerable) && expression.Arguments.Count == 2)
                {
                    FluentExpressionSQLProvider.Where(expression.Arguments[1], sqlPack);
                    sqlPack += " IN ";
                    FluentExpressionSQLProvider.In(expression.Arguments[0], sqlPack);
                }
            }



            //sqlPack += " LIKE '%' +";
            //FluentExpressionSQLProvider.Where(expression.Arguments[0], sqlPack);
            //sqlPack += " + '%'";
        }
Пример #7
0
        private static void LikeLeftNot(MethodCallExpression expression, SqlPack sqlPack)
        {
            if (expression.Object != null)
            {
                FluentExpressionSQLProvider.Where(expression.Object, sqlPack);
            }
            FluentExpressionSQLProvider.Where(expression.Arguments[0], sqlPack);
            //sqlPack += " LIKE '%' +";
            //FluentExpressionSQLProvider.Where(expression.Arguments[1], sqlPack);
            string result = "";

            var column = expression.Arguments[1].GetValueOrColumnName(sqlPack);

            result = sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.LikeLeft, column);

            sqlPack += " NOT LIKE ";

            sqlPack.CurrentDbFunctionResult = result;
        }
Пример #8
0
        protected override SqlPack Join(BinaryExpression expression, SqlPack sqlPack)
        {
            FluentExpressionSQLProvider.Join(expression.Left, sqlPack);
            int operatorIndex = sqlPack.Sql.Length;

            FluentExpressionSQLProvider.Join(expression.Right, sqlPack);
            int sqlLength = sqlPack.Sql.Length;

            if (sqlLength - operatorIndex == 5 && sqlPack.ToString().EndsWith("null"))
            {
                OperatorParser(expression.NodeType, operatorIndex, sqlPack, true);
            }
            else
            {
                OperatorParser(expression.NodeType, operatorIndex, sqlPack);
            }

            return(sqlPack);
        }
Пример #9
0
        private void AppendSql(Expression exp, SqlPack sqlPack)
        {
            var expression = exp as BinaryExpression;

            FluentExpressionSQLProvider.Where(expression.Left, sqlPack);
            int signIndex = sqlPack.Length;

            FluentExpressionSQLProvider.Where(expression.Right, sqlPack);
            int sqlLength = sqlPack.Length;

            if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null", StringComparison.InvariantCultureIgnoreCase))
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack, true);
            }
            else
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack);
            }
        }
Пример #10
0
        private static void StartsWith(MethodCallExpression expression, SqlPack sqlPack)
        {
            if (expression.Object != null)
            {
                FluentExpressionSQLProvider.Where(expression.Object, sqlPack);
            }

            string result = "";

            var column = expression.Arguments[0].GetValueOrColumnName(sqlPack);

            result = sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.StartsWith, column);

            sqlPack += " LIKE ";

            sqlPack.CurrentDbFunctionResult = result;


            //sqlPack += " LIKE ";

            //FluentExpressionSQLProvider.Where(expression.Arguments[0], sqlPack);
            //sqlPack += " + '%'";
        }
Пример #11
0
 protected override SqlPack Sum(UnaryExpression expression, SqlPack sqlPack)
 {
     FluentExpressionSQLProvider.Sum(expression.Operand, sqlPack);
     return(sqlPack);
 }
Пример #12
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);
        }
Пример #13
0
 private static void InNot(MethodCallExpression expression, SqlPack sqlPack)
 {
     FluentExpressionSQLProvider.Where(expression.Arguments[0], sqlPack);
     sqlPack += " NOT IN ";
     FluentExpressionSQLProvider.In(expression.Arguments[1], sqlPack);
 }
Пример #14
0
 public GroupByExpression <T> ThenGroupBy <T2>(Expression <Func <T2, object> > expression)
 {
     SqlPack += " ,";
     FluentExpressionSQLProvider.GroupBy(expression.Body, SqlPack);
     return(this);
 }
Пример #15
0
        protected override SqlPack Where(BinaryExpression expression, SqlPack sqlPack)
        {
            int signIndex = 0, sqlLength = 0;

            if (expression.NodeType == ExpressionType.AndAlso)
            {
                // true && a.ID == 1 或者 a.ID == 1 && true
                Expression         left = expression.Left, right = expression.Right;
                ConstantExpression c = right as ConstantExpression;
                // DbExpression dbExp = null;
                //a.ID == 1 && true
                if (c != null)
                {
                    if ((bool)c.Value == true)
                    {
                        // (a.ID==1)==true
                        //dbExp = new DbEqualExpression(this.Visit(exp.Left), new DbConstantExpression(true));
                        //dbExp = this.Visit(Expression.Equal(exp.Left, UtilConstants.Constant_True));
                        FluentExpressionSQLProvider.Where(expression.Left, sqlPack);

                        signIndex = sqlPack.Length;

                        sqlPack  += " " + TrueLiteral;
                        sqlLength = sqlPack.Length;

                        if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack, true);
                        }
                        else
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack);
                        }

                        return(sqlPack);
                    }
                    else
                    {
                        sqlPack += " " + FalseLiteral;
                        return(sqlPack);
                        //dbExp = DbEqualExpression.False;
                        // return dbExp;
                    }
                }

                c = left as ConstantExpression;
                // true && a.ID == 1
                if (c != null)
                {
                    if ((bool)c.Value == true)
                    {
                        // (a.ID==1)==true

                        sqlPack  += " " + TrueLiteral;
                        signIndex = sqlPack.Length;

                        FluentExpressionSQLProvider.Where(expression.Right, sqlPack);
                        sqlLength = sqlPack.Length;


                        if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack, true);
                        }
                        else
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack);
                        }

                        return(sqlPack);

                        //dbExp = this.Visit(Expression.Equal(exp.Right, UtilConstants.Constant_True));
                        //return dbExp;
                    }
                    else
                    {
                        // 直接 (1=0)

                        sqlPack += " " + FalseLiteral;
                        return(sqlPack);
                        //dbExp = DbEqualExpression.False;
                        // return dbExp;
                    }
                }
            }
            else if (expression.NodeType == ExpressionType.OrElse)
            {
                // true && a.ID == 1 或者 a.ID == 1 && true
                Expression         left = expression.Left, right = expression.Right;
                ConstantExpression c = right as ConstantExpression;
                //DbExpression dbExp = null;
                //a.ID == 1 || true
                if (c != null)
                {
                    if ((bool)c.Value == false)
                    {
                        // (a.ID==1)==true
                        FluentExpressionSQLProvider.Where(expression.Left, sqlPack);
                        signIndex = sqlPack.Length;

                        sqlPack  += " " + FalseLiteral;
                        sqlLength = sqlPack.Length;

                        if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack, true);
                        }
                        else
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack);
                        }

                        return(sqlPack);
                        //dbExp = this.Visit(Expression.Equal(exp.Left, UtilConstants.Constant_True));
                        //return dbExp;
                    }
                    else
                    {
                        sqlPack += " " + TrueLiteral;
                        return(sqlPack);

                        // dbExp = DbEqualExpression.True;
                        // return dbExp;
                    }
                }

                c = left as ConstantExpression;
                // true || a.ID == 1
                if (c != null)
                {
                    if ((bool)c.Value == false)
                    {
                        // (a.ID==1)==true
                        sqlPack  += " " + FalseLiteral;
                        signIndex = sqlPack.Length;

                        FluentExpressionSQLProvider.Where(expression.Right, sqlPack);
                        sqlLength = sqlPack.Length;

                        if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack, true);
                        }
                        else
                        {
                            OperatorParser(expression.NodeType, signIndex, sqlPack);
                        }

                        return(sqlPack);

                        //dbExp = this.Visit(Expression.Equal(exp.Right, UtilConstants.Constant_True));
                        //return dbExp;
                    }
                    else
                    {
                        // 直接 (1=1)
                        sqlPack += " " + TrueLiteral;
                        return(sqlPack);
                        //dbExp = DbEqualExpression.True;
                        //return dbExp;
                    }
                }
            }



            if (HasBeginInOwnLogic(expression, sqlPack))
            {
                sqlPack += " (";
            }

            //sqlPack.WhereConditionIndex = sqlPack.WhereConditionIndex + 1;


            FluentExpressionSQLProvider.Where(expression.Left, sqlPack);
            signIndex = sqlPack.Length;

            FluentExpressionSQLProvider.Where(expression.Right, sqlPack);
            sqlLength = sqlPack.Length;

            if (sqlLength - signIndex == 5 && sqlPack.ToString().EndsWith("null"))
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack, true);
            }
            else
            {
                OperatorParser(expression.NodeType, signIndex, sqlPack);
            }

            if (HasEndInOwnLogic(expression, sqlPack))
            {
                sqlPack += ")";
            }
            return(sqlPack);
        }