Example #1
0
        private static object VisitLambda(LambdaExpression lambda, SQLExpressionVisitorContenxt context)
        {
            if (lambda.Body.NodeType == ExpressionType.MemberAccess && context.Seperator == " ")
            {
                MemberExpression m = lambda.Body as MemberExpression;

                if (m.Expression != null)
                {
                    object r = VisitMemberAccess(m, context);

                    if (!(r is PartialSqlString))
                    {
                        return(r);
                    }

                    if (!m.Expression.Type.IsValueType)
                    {
                        return(r.ToString());
                    }

                    return($"{r}={context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)}");
                }
            }
            return(Visit(lambda.Body, context));
        }
        internal FromExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory)
        {
            _entityDefFactory = entityDefFactory;

            _expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory)
            {
                ParamPlaceHolderPrefix = databaseEngine.ParameterizedChar + "f__"
            };
        }
Example #3
0
        private static object VisitBinary(BinaryExpression b, SQLExpressionVisitorContenxt context)
        {
            object left, right;
            bool   rightIsNull;
            string operand = BindOperant(b.NodeType);   //sep= " " ??

            if (operand == "AND" || operand == "OR")
            {
                if (b.Left is MemberExpression m && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter)
                {
                    left = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)));
                }
                else
                {
                    left = Visit(b.Left, context);
                }

                m = b.Right as MemberExpression;

                if (m != null && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter)
                {
                    right = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)));
                }
                else
                {
                    right = Visit(b.Right, context);
                }

                if (left as PartialSqlString == null && right as PartialSqlString == null)
                {
                    object result = Expression.Lambda(b).Compile().DynamicInvoke();
                    return(new PartialSqlString(context.DatabaesEngine.GetDbValueStatement(result, needQuoted: true)));
                }

                if (left as PartialSqlString == null)
                {
                    left = ((bool)left) ? GetTrueExpression(context) : GetFalseExpression(context);
                }

                if (right as PartialSqlString == null)
                {
                    right = ((bool)right) ? GetTrueExpression(context) : GetFalseExpression(context);
                }
            }
        private static object VisitBinary(BinaryExpression b, SQLExpressionVisitorContenxt context)
        {
            object left;
            object right;
            bool   rightIsNull;
            string operand = BindOperant(b.NodeType);

            if (operand == "AND" || operand == "OR")
            {
                if (b.Left is MemberExpression m && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter)
                {
                    left = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)));
                }
                else
                {
                    left = Visit(b.Left, context);
                }


                if (b.Right is MemberExpression mm && mm.Expression != null && mm.Expression.NodeType == ExpressionType.Parameter)
                {
                    right = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(mm, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)));
                }
 internal FromExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory)
 {
     this.entityDefFactory = entityDefFactory;
     _databaseEngine       = databaseEngine;
     expressionContext     = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory);
 }
Example #6
0
 internal SelectExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory)
 {
     _expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory);
 }
Example #7
0
        public static object Visit(Expression exp, SQLExpressionVisitorContenxt context)
        {
            if (exp == null)
            {
                return(string.Empty);
            }
            switch (exp.NodeType)
            {
            case ExpressionType.Lambda:
                return(VisitLambda(exp as LambdaExpression, context));

            case ExpressionType.MemberAccess:
                return(VisitMemberAccess(exp as MemberExpression, context));

            case ExpressionType.Constant:
                return(VisitConstant(exp as ConstantExpression, context));

            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:
                return(VisitBinary(exp as BinaryExpression, context));

            case ExpressionType.Negate:
            case ExpressionType.NegateChecked:
            case ExpressionType.Not:
            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
            case ExpressionType.ArrayLength:
            case ExpressionType.Quote:
            case ExpressionType.TypeAs:
                return(VisitUnary(exp as UnaryExpression, context));

            case ExpressionType.Parameter:
                return(VisitParameter(exp as ParameterExpression, context));

            case ExpressionType.Call:
                return(VisitMethodCall(exp as MethodCallExpression, context));

            case ExpressionType.New:
                return(VisitNew(exp as NewExpression, context));

            case ExpressionType.NewArrayInit:
            case ExpressionType.NewArrayBounds:
                return(VisitNewArray(exp as NewArrayExpression, context));

            case ExpressionType.MemberInit:
                return(VisitMemberInit(exp as MemberInitExpression, context));

            default:
                return(exp.ToString());
            }
        }
Example #8
0
 internal WhereExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory)
 {
     this.databaseEngine = databaseEngine;
     expressionContext   = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory);
     expressionContext.ParamPlaceHolderPrefix = databaseEngine.ParameterizedChar + "w__";
 }