コード例 #1
0
        private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, UnaryExpression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Convert:
                return(Analyze(provider, previousAnalyze, expression.Operand));

            case ExpressionType.ConvertChecked:
                return(Analyze(provider, previousAnalyze, expression.Operand));

            case ExpressionType.Not:
                var analyzeResult = Analyze(provider, previousAnalyze, expression.Operand);
                analyzeResult.SetSql("(" + analyzeResult.GetSql() + ") = false");
                return(analyzeResult);
            }

            return(null);
        }
コード例 #2
0
        private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, ConstantExpression expression, MemberExpression parentExpression, MemberExpression parentMemberExpression = null)
        {
            var valueObject = expression.Value.GetType().GetField(parentExpression.Member.Name).GetValue(expression.Value);

            if (valueObject == null)
            {
                return(new AnalyzeResult(null, null));
            }

            //keep going deeper until valueObject is a system type
            if (valueObject.GetType().IsSystemType())
            {
                return(new AnalyzeResult(null, valueObject));
            }

            var value = valueObject.GetType().GetProperty(parentMemberExpression.Member.Name).GetValue(valueObject, null);

            return(new AnalyzeResult(null, value));
        }
コード例 #3
0
        private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, MemberExpression expression, MemberExpression parentMemberExpression = null)
        {
            if (expression.Expression is MemberExpression)
            {
                return(Analyze(provider, previousAnalyze, (MemberExpression)expression.Expression, expression));

                /*var memberExpression = (MemberExpression)expression.Expression;
                 * if (memberExpression.Expression is ConstantExpression)
                 * {
                 *  return Analyze(provider, previousAnalyze, (ConstantExpression)memberExpression.Expression, memberExpression);
                 * }*/
            }

            if (expression.Expression is ConstantExpression)
            {
                return(Analyze(provider, previousAnalyze, (ConstantExpression)expression.Expression, expression, parentMemberExpression));
            }

            var pi   = expression.Member.DeclaringType.GetProperty(expression.Member.Name);
            var attr = pi.GetCustomAttributes(typeof(SqlFieldAttribute), false).SingleOrDefault() as SqlFieldAttribute;

            return(new AnalyzeResult(attr != null ? attr.GetName(pi) : expression.Member.Name, null));
        }
コード例 #4
0
 public AnalyzeResult(AnalyzeResult left, AnalyzeResult right)
 {
     _left  = left;
     _right = right;
 }
コード例 #5
0
 private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, ConstantExpression expression)
 {
     return(new AnalyzeResult(null, expression.Value));
 }
コード例 #6
0
        private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, Expression expression)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Add:
                break;

            //case ExpressionType.AddAssign:
            //    break;
            //case ExpressionType.AddAssignChecked:
            //    break;
            case ExpressionType.AddChecked:
                break;

            //case ExpressionType.AndAssign:
            //    break;
            case ExpressionType.ArrayIndex:
                break;

            case ExpressionType.ArrayLength:
                break;

            //case ExpressionType.Assign:
            //    break;
            //case ExpressionType.Block:
            //    break;
            case ExpressionType.Call:
                return(Analyze(provider, previousAnalyze, (MethodCallExpression)expression));

            case ExpressionType.Coalesce:
                break;

            case ExpressionType.Conditional:
                break;

            case ExpressionType.Constant:
                return(Analyze(provider, previousAnalyze, (ConstantExpression)expression));

            case ExpressionType.Convert:
                break;

            case ExpressionType.ConvertChecked:
                break;

            //case ExpressionType.DebugInfo:
            //    break;
            //case ExpressionType.Decrement:
            //    break;
            //case ExpressionType.Default:
            //    break;
            case ExpressionType.Divide:
                break;

            //case ExpressionType.DivideAssign:
            //    break;
            //case ExpressionType.Dynamic:
            //    break;
            case ExpressionType.Equal:
            case ExpressionType.NotEqual:
            case ExpressionType.And:
            case ExpressionType.AndAlso:
            case ExpressionType.GreaterThan:
            case ExpressionType.GreaterThanOrEqual:
            case ExpressionType.LessThan:
            case ExpressionType.LessThanOrEqual:
            case ExpressionType.Or:
            case ExpressionType.OrElse:
                return(Analyze(provider, previousAnalyze, (BinaryExpression)expression));

            case ExpressionType.ExclusiveOr:
                break;

            //case ExpressionType.ExclusiveOrAssign:
            //    break;
            //case ExpressionType.Extension:
            //    break;
            //case ExpressionType.Goto:
            //    break;
            //case ExpressionType.Increment:
            //    break;
            //case ExpressionType.Index:
            //    break;
            case ExpressionType.Invoke:
                break;

            //case ExpressionType.IsFalse:
            //    break;
            //case ExpressionType.IsTrue:
            //    break;
            //case ExpressionType.Label:
            //    break;
            case ExpressionType.Lambda:
                break;

            case ExpressionType.LeftShift:
                break;

            //case ExpressionType.LeftShiftAssign:
            //    break;
            case ExpressionType.ListInit:
                break;

            //case ExpressionType.Loop:
            //    break;
            case ExpressionType.MemberAccess:
                return(Analyze(provider, previousAnalyze, (MemberExpression)expression));

            case ExpressionType.MemberInit:
                break;

            case ExpressionType.Modulo:
                break;

            //case ExpressionType.ModuloAssign:
            //    break;
            case ExpressionType.Multiply:
                break;

            //case ExpressionType.MultiplyAssign:
            //    break;
            //case ExpressionType.MultiplyAssignChecked:
            //    break;
            case ExpressionType.MultiplyChecked:
                break;

            case ExpressionType.Negate:
                break;

            case ExpressionType.NegateChecked:
                break;

            case ExpressionType.New:
                break;

            case ExpressionType.NewArrayBounds:
                break;

            case ExpressionType.NewArrayInit:
                break;

            case ExpressionType.Not:
                break;

            //case ExpressionType.OnesComplement:
            //    break;
            //case ExpressionType.OrAssign:
            //    break;
            case ExpressionType.Parameter:
                break;

            //case ExpressionType.PostDecrementAssign:
            //    break;
            //case ExpressionType.PostIncrementAssign:
            //    break;
            case ExpressionType.Power:
                break;

            //case ExpressionType.PowerAssign:
            //    break;
            //case ExpressionType.PreDecrementAssign:
            //    break;
            //case ExpressionType.PreIncrementAssign:
            //    break;
            case ExpressionType.Quote:
                break;

            case ExpressionType.RightShift:
                break;

            //case ExpressionType.RightShiftAssign:
            //    break;
            //case ExpressionType.RuntimeVariables:
            //    break;
            case ExpressionType.Subtract:
                break;

            //case ExpressionType.SubtractAssign:
            //    break;
            //case ExpressionType.SubtractAssignChecked:
            //    break;
            case ExpressionType.SubtractChecked:
                break;

            //case ExpressionType.Switch:
            //    break;
            //case ExpressionType.Throw:
            //    break;
            //case ExpressionType.Try:
            //    break;
            case ExpressionType.TypeAs:
                break;

            //case ExpressionType.TypeEqual:
            //    break;
            case ExpressionType.TypeIs:
                break;

            case ExpressionType.UnaryPlus:
                break;

            //case ExpressionType.Unbox:
            //    break;
            default:
                break;
            }
            if (expression is UnaryExpression)
            {
                return(Analyze(provider, previousAnalyze, (UnaryExpression)expression));
            }

            var type = expression.GetType();

            return(null);
        }
コード例 #7
0
        private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, BinaryExpression expression)
        {
            var analyzeLeft  = Analyze(provider, previousAnalyze, expression.Left);
            var analyzeRight = Analyze(provider, analyzeLeft, expression.Right);

            var leftSql = analyzeLeft.GetSql();

            if (leftSql == null)
            {
                leftSql = analyzeLeft.ParameterName;
            }
            var rightSql = analyzeRight.GetSql();

            if (rightSql == null)
            {
                rightSql = provider.CreateParameterName(analyzeLeft.ParameterName);
            }

            var analyzeResult = new AnalyzeResult(analyzeLeft, analyzeRight);

            if (!analyzeLeft.HasParameterCombination && !analyzeRight.HasParameterCombination)
            {
                analyzeResult.SetParameterCombination(analyzeLeft.ParameterName, analyzeRight.ParameterValue);
            }

            switch (expression.NodeType)
            {
            case ExpressionType.Equal:
                if (analyzeRight.ParameterValue == null)
                {
                    analyzeResult.SetSql(leftSql + " is null");
                }
                else
                {
                    analyzeResult.SetSql(leftSql + " = " + rightSql);
                }
                break;

            case ExpressionType.NotEqual:
                if (analyzeRight.ParameterValue == null)
                {
                    analyzeResult.SetSql(leftSql + " is not null");
                }
                else
                {
                    analyzeResult.SetSql(leftSql + " <> " + rightSql);
                }
                break;

            case ExpressionType.GreaterThan:
                analyzeResult.SetSql(leftSql + " > " + rightSql);
                break;

            case ExpressionType.GreaterThanOrEqual:
                analyzeResult.SetSql(leftSql + " >= " + rightSql);
                break;

            case ExpressionType.LessThan:
                analyzeResult.SetSql(leftSql + " < " + rightSql);
                break;

            case ExpressionType.LessThanOrEqual:
                analyzeResult.SetSql(leftSql + " <= " + rightSql);
                break;

            case ExpressionType.AndAlso:
            case ExpressionType.And:
                analyzeResult.SetSql("(" + leftSql + ") and (" + rightSql + ")");
                break;

            case ExpressionType.OrElse:
            case ExpressionType.Or:
                analyzeResult.SetSql("(" + leftSql + ") or (" + rightSql + ")");
                break;

            default:
                return(null);
            }

            return(analyzeResult);
        }