我在我的应用程序中使用linq。查询有几个条件.Where(a => !one || a.id == 1)
。
bool one = false;
bool two = false;
bool three = false;
db.type.Where(w => !one|| w.id == 1).Where(w => !two || w.id == 2).Where(w => !three || w.id == 3).ToList()
但是这个查询给了我结果:
db.type.Where(w => w.id == 1 &&
w.id == 2 &&
w.id == 3)
我想得到:
db.type.Where(w => w.id == 1 ||
w.id == 2 ||
w.id == 3)
请帮帮我。我怎么能解决这个问题?
答案 0 :(得分:0)
如果你需要or
where谓词中的id,你可以使用Enumerable.Contains()
这样的方法:
var ids = new[]{1, 2, 3};
db.type.Where(w => ids.Contains(w.id));
但是,我假设你想要的是一种动态创建Where
子句的谓词的方法,相信我,使用带有或带条件的标志不是这样做的方法; 不仅条件会让其他读取该代码的人流血,而且还会导致查询性能下降。
正确的方法是使用PredicateBuilder
。看一下这篇文章,看看它应该如何使用以及它的作用。
但是有一点需要注意 - 它不会在Entity Framework
或nHibernate
中工作。要为上述ORM创建一个,请在Universal predicate builder上使用此博文。