实体框架多个Where语句为OR

时间:2014-07-02 17:01:43

标签: c# entity-framework

编辑 - 使用IQueryable,而不是内存集合。

所以我基本上想要根据一些标志来处理Where子句,但不要让它们充当AND。所以,假设我想要“Foo”为真或“Bar”为真的结果。我现在正在这样做......

results = results.Where(r => r.Foo || r.Bar);

这很好,但是我需要添加OR的很多条件,如果我可以将它们链接在一起,它会使代码更具可读性。

是否有任何简单的方法可以像下面这样做,但使用OR代替AND。

if (something)
    results = results.Where(r => r.Foo)
if (somethingElse)
    results = results.Where(r => r.Bar)

如果我必须构建Expression对象和类似的东西,或使用第三方库,只是想知道是否有一些我没有看到的简单的东西,对我来说并不值得。

另外,我考虑使用Union(),但它似乎执行得更慢(尽管它更具可读性)。

更多可以提供帮助的信息。基本上我的条件是用户角色。它们可以是角色的任意组合,但每个角色都应该在“结果”中添加OR条件。所以是的,有人提到的枚举标志可以帮到这里。

1 个答案:

答案 0 :(得分:8)

使用PredicateBuilder。 http://www.albahari.com/nutshell/predicatebuilder.aspx

这是十几行,它可以让你这样做:

Expression<...> filter = PredicateBuilder.False();
if (something)
    filter = filter.Or(r => r.Foo);
if (somethingElse)
    filter = filter.Or(r => r.Bar);
return results.Where(filter);

这为您提供了与您编写的相同的性能优势:

if (something && somethingElse)
    return results.Where(r => r.Foo || r => r.Bar)
else if (something)
    return results.Where(r => r.foo)
else if (somethingElse)
    return results.Where(r => r.Bar)
etc...