Caf*_*eek 5 c# .net-4.0 expression-trees
我正在努力构建表达式树,以便我可以动态地对某些数据进行过滤.
我想出了这一点,但在失败var lambda =行
foreach (var rule in request.Where.Rules)
{
var parameterExpression = Expression.Parameter(typeof(string), rule.Field);
var left = Expression.Call(parameterExpression, typeof(string).GetMethod("ToLower", Type.EmptyTypes));
var right = Expression.Constant(rule.Data.ToLower());
var method = typeof(string).GetMethod("Contains", new [] { typeof(string) });
var call = Expression.Call(left, method, right);
var lambda = Expression.Lambda<Func<T, bool>>(call, parameterExpression);
query = query.Where(lambda);
}
Run Code Online (Sandbox Code Playgroud)
var rule有一个Field(ex"Name"),我想与rule.Data(ex'tom')中的文本进行比较.因此,如果T.Name.Contains("tom");我希望查询包含记录,否则,不是.
var query是类型的IQueryable<T>
编辑:最后得到它使用此代码:
foreach (var rule in request.Where.Rules)
{
var parameter = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(parameter, rule.Field);
var value = Expression.Constant(rule.Data);
var type = value.Type;
var containsmethod = type.GetMethod("Contains", new[] { typeof(string) });
var call = Expression.Call(property, containsmethod, value);
var lambda = Expression.Lambda<Func<T, bool>>(call, parameter);
query = query.Where(lambda);
}
Run Code Online (Sandbox Code Playgroud)
您已经快到了,但是您的参数表达式应该是 类型T,而不是String,您还缺少从 name 等类型获取属性的表达式T。
你大概应该有的是这个
val -> Expression.Constant(typeof(string), rule.Field)
parameter -> Expression.Parameter(typeof(T), "p")
property -> Expression.Property(parameter, "PropertyName")
contains -> Expression.Call(property, containsmethod, val)
equals true -> Expression.True or equals, something like that
Run Code Online (Sandbox Code Playgroud)
所有这些都是我徒手做的,所以它的有效性可能会有所不同。结果表达式应该是这样的
p => p.Name.Contains(val)
Run Code Online (Sandbox Code Playgroud)