编辑 - 使用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条件。所以是的,有人提到的枚举标志可以帮到这里。
答案 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...