如何将左右绑定表达式转换为下?

Pra*_*ees 2 c# linq

我使用下面的代码来生成动态绑定表达式;这里如何将表达式左右部分转换为下?因为我想过滤小写和大写过滤器。

private static Expression GetExpression<T>(ParameterExpression param, Filter filter)
    {
        MemberExpression member = Expression.Property(param, filter.PropertyName);
        ConstantExpression constant = Expression.Constant(filter.Value);

        switch (filter.Operation)
        {
            case Op.Equals:
                return Expression.Equal(member, constant);

            case Op.GreaterThan:
                return Expression.GreaterThan(member, constant);

            case Op.GreaterThanOrEqual:
                return Expression.GreaterThanOrEqual(member, constant);

            case Op.LessThan:
                return Expression.LessThan(member, constant);

            case Op.LessThanOrEqual:
                return Expression.LessThanOrEqual(member, constant);

            case Op.Contains:
                return Expression.Call(member, containsMethod, constant);

            case Op.StartsWith:
                return Expression.Call(member, startsWithMethod, constant);

            case Op.EndsWith:
                return Expression.Call(member, endsWithMethod, constant);
        }

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

Ofi*_*ten 7

如果我理解正确,那么您可以使用以下内容:

MemberExpression member = Expression.Property(param, filter.PropertyName);
ConstantExpression constant = Expression.Constant(filter.Value);

Expression left = Expression.Call(member, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
Expression right = Expression.Call(constant, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
Run Code Online (Sandbox Code Playgroud)

在你的交换机替换memberleft,并constantright

关于空检查的更新
您可以通过以下方式检查成员属性是否为空:(假设它originalExpression包含来自 的表达式switch

var nullCheck = Expression.Equal(member, Expression.Constant(null, member.Type));
Run Code Online (Sandbox Code Playgroud)

Expression.IfThenElse(nullCheck, Expression.Constant(false), originalExpression);

Expression.Conditional(nullCheck, Expression.Constant(false), originalExpression);
Run Code Online (Sandbox Code Playgroud)

更新 2
您应该检查属性和值上的空值:

var nullCheckProp = Expression.Equal(member, Expression.Constant(null, member.Type)); 
var nullCheckVal = Expression.Equal(constant, Expression.Constant(null, constant.Type)); 
var nullCheckBoth = Expression.OrElse(nullCheckProp,nullCheckVal);

Expression.Conditional(nullCheckBoth, Expression.Constant(false), originalExpression);
Run Code Online (Sandbox Code Playgroud)