2016-04-14 97 views
-1

我在我的应用程序中使用linq。查询有几个条件.Where(a => !one || a.id == 1)多个条件linq

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

链接多个'Where'等价于使用'&&'的单个'Where'。我想你可以看到你不能用这种技术来模拟'||'。 –

+0

@IvanStoev我可以用其他技术解决这个问题吗? – ukrainianDev

+0

您能否提供一些样本输入和输出数据?变量'one'和id'1'之间是否有关系? – RePierre

回答

0

如果需要or的ID在你那里谓语可以使用Enumerable.Contains()方法是这样的:

var ids = new[]{1, 2, 3}; 
db.type.Where(w => ids.Contains(w.id)); 

不过,我假设你想是一种动态创建的Where谓语条款和相信我,使用标志或条件不是这样做的方式; 不仅条件会使其他人阅读该代码而流血,而且还会导致查询性能不佳。 正确的做法是使用PredicateBuilder。看看这篇文章,看看它应该如何使用以及它的功能。

但有一个警告 - 它不会在Entity FrameworknHibernate工作。要为上述ORM创建一个,请在Universal predicate builder上使用此博客文章。

+0

谢谢你的帮助,我正在使用Universal predicate builder和谓词类给我的结果! – ukrainianDev