如何在Linq中写这个WHERE条件?

时间:2014-08-03 08:15:33

标签: c# .net linq

如何在Linq中编写此where条件?

var result = from i in context.ItemsFullDetails where i.iditem in (1,2,3,4)

where条件包含一个id列表,其中可与iditem列进行比较。

如果我以上述方式写作,我会收到错误。

3 个答案:

答案 0 :(得分:4)

试试这个:

/*Hold here the items you want to filter by*/
var filterCriteria = new List(){1,2,3,4};
/*Get results as Ienumerable<int>*/
var result = context.ItemsFullDetails.Where(i => filterCriteria.Contains(i.iditem));

如果您想以列表/数组的形式获取结果,可以使用result.ToList() / result.ToArray()

答案 1 :(得分:3)

尝试这种方法:

//create filter list
int[] productList = new int[] { 1, 2, 3, 4 };

// check your search item exists in the filter list
var myProducts = from p in db.Products
                 where productList.Contains(p.ProductID)
                select p;

参考: What is LINQ equivalent of SQL’s "IN" keyword

答案 2 :(得分:1)

你有几个选择。第一个,正如我看到很多人在这个和类似的帖子上建议的那样,是从LINQ查询创建一个外部集合,并使用Contains来反对:

int[] items = new[] { 1, 2, 3, 4 };
var result = from i in context.ItemsFullDetails where items.Contains(i.iditem)

但是说,如果你的例子或多或少是你真正想做的事情而你确实有一套可能的,我会更想写出逻辑:

var result = from i in context.ItemsFullDetails where i.iditem == 1
                                                      || i.iditem == 2
                                                      || i.iditem == 3
                                                      || i.iditem == 4

现在,这几乎一样漂亮。我同意。 但是这将是你做的事情最有效的方式,而且我认为它不够可读 - 特别是对于那些天生习惯于这样的逻辑的有经验的开发人员 - 保证缺乏效率。现在,显然,只有拥有编译时集合集时,此方法才有效。但是既然你在你的例子中做了,我假设你将在现实生活中。这就是我要做的。然后,您不必冒险为每个元素循环遍历整个集合。

或者,如果您需要一组动态条件:

List<int> items = new List<int>() { 1, 2, 3, 4 };

items.Add(...);;

var result = from i in context.ItemsFullDetails where items.Contains(i.iditem)