linq中Where方法的动态lambda

时间:2014-06-26 23:59:07

标签: c# linq lambda

我想知道如何动态传递对象的属性作为将在Where的{​​{1}}方法中使用的lambda的一部分。

假设我有这段代码:

IQueryable

我的任务是将最后一个语句作为通用方法并使用参数:

var list = new List<Item>();
...

var filtered = list.AsQueryable().Where(x => x.SomePropertyA.Contains(someStringValue));

...

我的胆量告诉我,我必须使用Expressions类来调用IQueryable<Item> SomeMethod(Expression<Func<Item, string>> expr, string stringValue) { return list.AsQueryable().Where (???); } SomeMethod(x => x.SomePropertyA, someStringValue); SomeMethod(x => x.SomePropertyB, someStringValue); 返回的字符串的Contains方法,但不知道如何执行此操作,因为我不是非常熟悉这个......

1 个答案:

答案 0 :(得分:1)

此方法将创建所需的表达式:

static Expression<Func<T, bool>> CreateContainsPredicate<T>(Expression<Func<T, string>> property, string value)
{
    return Expression.Lambda<Func<T, bool>>( // Where() wants this kind of expression
        Expression.Call(                     // we need to call method
            property.Body,                   // on instance returned by passed expression
            typeof(string).GetMethod("Contains", new [] { typeof(string) }), // call 'Contains()'
            Expression.Constant(value)),     // pass value to Contains() method
        property.Parameters);                // resulting expression has same parameters as input expression
}

用法:

IQueryable<Item> SomeMethod(Expression<Func<Item, string>> expr, string stringValue) {
    return list.AsQueryable().Where(CreateContainsPredicate<Item>(expr, stringValue));
}