コード例 #1
0
        public static SqlPredicate Parse(Expression expression)
        {
            var methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                if (methodCallExpression.Method.Name == nameof(string.Contains))
                {
                    var memberExpression = methodCallExpression.Object as MemberExpression;
                    return(QB.Like(memberExpression.Member.Name, Expression.Lambda(methodCallExpression.Arguments.First()).Compile().DynamicInvoke()));
                }
                else
                {
                    throw new Exception($"Unsupported method {methodCallExpression.Method.Name} in expression {expression}.");
                }
            }

            var binaryExpression = expression as BinaryExpression;

            if (binaryExpression == null)
            {
                throw new Exception($"Unsupported expression {expression}.");
            }

            switch (binaryExpression.NodeType)
            {
            case ExpressionType.AndAlso:
                return(QB.And(Parse(binaryExpression.Left), Parse(binaryExpression.Right)));

            case ExpressionType.OrElse:
                return(QB.Or(Parse(binaryExpression.Left), Parse(binaryExpression.Right)));

            case ExpressionType.NotEqual:
                var nameAndValue0 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.NEq(nameAndValue0.Item1, nameAndValue0.Item2));

            case ExpressionType.Equal:
                var nameAndValue1 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.Eq(nameAndValue1.Item1, nameAndValue1.Item2));

            case ExpressionType.LessThan:
                var nameAndValue2 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.Le(nameAndValue2.Item1, nameAndValue2.Item2));

            case ExpressionType.LessThanOrEqual:
                var nameAndValue3 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.LEq(nameAndValue3.Item1, nameAndValue3.Item2));

            case ExpressionType.GreaterThan:
                var nameAndValue4 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.Gr(nameAndValue4.Item1, nameAndValue4.Item2));

            case ExpressionType.GreaterThanOrEqual:
                var nameAndValue5 = GetColumnNameAndParameterValue(binaryExpression);
                return(QB.GEq(nameAndValue5.Item1, nameAndValue5.Item2));

            default:
                throw new Exception($"Unsupported expression {expression}.");
            }
        }