这个问题已经在这里有一个答案:
- 如何创建一个表达式树来表示C#“String.Contains(‘术语’)”? 4个回答
我挣扎构建表达式树,所以我可以做动态的一些数据过滤。
我想出了这一点,但在失败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);
}
var这个rule
有哪些我想用文字来比较字段(如“姓名”) rule.Data
(EX“嗵”)。 所以,如果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);
}