我使用下面的代码来生成动态绑定表达式;这里如何将表达式左右部分转换为下?因为我想过滤小写和大写过滤器。
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)
如果我理解正确,那么您可以使用以下内容:
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)
在你的交换机替换member用left,并constant用right
关于空检查的更新
您可以通过以下方式检查成员属性是否为空:(假设它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)
| 归档时间: |
|
| 查看次数: |
1198 次 |
| 最近记录: |