假设我有这种方法来搜索适合某个关键字的产品的数据库:
public List<Product> GetByKeyword(string keyword)
{
using(var db = new DataEntities())
{
var query = db.Products.Where(x => x.Description.Contains(keyword);
return query.ToList();
}
}
这很好用,但在我项目的其他地方,我希望仅依靠关键字获取有效产品。我想做点什么:
...
var result = ProductStore.GetByKeyword("Apple", x => x.isActive == 1);
因此,我创建了这个方法:
public List<Product> GetByKeyword(string keyword, Func<Product, bool> predicate = null)
{
using(var db = new DataEntities())
{
var query = db.Products.Where(x => x.Description.Contains(keyword);
if(predicate != null)
query = query.Where(x => predicate(x));
return query.ToList();
}
}
虽然编译得很好,但ToList()调用会生成 NotSupportedException ,因为LINQ不支持Invoke方法。
当然,我可以用另一种方法 即 GetActiveByKeyword(字符串关键字)但是我必须为每个可能的变体做一个,包括那些我没想到的......
我如何让它工作?谢谢!
答案 0 :(得分:2)
不仅仅是这个:
if(predicate != null)
query = query.Where(predicate);
答案 1 :(得分:0)
正如AD.Net所说,之前它与Expression
一起工作的原因是因为如果你说编译器知道它将是一个lambda表达式