Entityframework - 将表达式添加到where子句

时间:2014-01-21 16:44:12

标签: c# linq entity-framework predicate

假设我有这种方法来搜索适合某个关键字的产品的数据库:

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(字符串关键字)但是我必须为每个可能的变体做一个,包括那些我没想到的......

我如何让它工作?谢谢!

2 个答案:

答案 0 :(得分:2)

不仅仅是这个:

if(predicate != null)
            query = query.Where(predicate);

答案 1 :(得分:0)

正如AD.Net所说,之前它与Expression一起工作的原因是因为如果你说编译器知道它将是一个lambda表达式