【问题标题】:Entityframework - Adding Expression to where clauseEntityframework - 将表达式添加到 where 子句
【发布时间】:2014-01-21 16:44:12
【问题描述】:

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

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(string keyword) 但是我必须为每一种可能的变化做一个,包括我没有想到的那些......

如何让它工作?谢谢!

【问题讨论】:

    标签: c# linq entity-framework predicate


    【解决方案1】:

    不就是这样吗:

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

    【讨论】:

    • 它不会像这样编译,但是如果我将参数更改为 Expression> 就可以了。以前试过,不知道为什么现在可以了……
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多