我有一个项目列表,每个项目都有多个关键字,所以我有三个表格
Item -> ItemKeyword <- Keyword
我想返回项目列表中所有关键字的所有项目。例如:
Item 1 has keywords "Rabbit", "Dog", "Cat"
Item 2 has keywords "Rabbit", Hedgehog", "Dog"
我想只返回那些同时包含“狗”和“猫”的项目作为关键字。
我无法使用包含查询,因为它基本上会返回带有“Dog”或“Cat”的所有项目。
所以我想我要求的是在linq中是否存在一个名为ContainsAll的东西,或者是否有某些方法可以执行此功能。
我试图使用Except和Intersect但我似乎无法得到正确的结果。
我想要一个查询,以便编译查询很容易,但这不是一个破坏者。
我正在使用:
答案 0 :(得分:2)
我无法使用包含查询,因为它基本上会返回带有“Dog”或“Cat”的所有项目。
这根本不是真的。您可以使用两个包含AND
&amp;&amp; :
items.Where(item => item.Keywords.Contains("Dog") && item.Keywords.Contains("Cat"));
或者您可以将您要查找的值放在数组中,然后使用All
方法缩短它:
var values = new [] { "Dog", "Cat" };
items.Where(item => values.All(item.Keywords.Contains));
答案 1 :(得分:1)
请检查此..代码写得更长,以便更好地理解..假设每个项目作为标识符来检查
List<item> ItemsList = new List<item>();
item item1 = new item();
item1.ID = "1";
item1.keywords = new List<string>();
item1.keywords.Add("Rabbit");
item1.keywords.Add("Dog");
item1.keywords.Add("Cat");
ItemsList.Add(item1);
item item2 = new item();
item2.ID = "2";
item2.keywords = new List<string>();
item2.keywords.Add("Rabbit");
item2.keywords.Add("Hedgehog");
item2.keywords.Add("Dog");
ItemsList.Add(item2);
//this the list you want to check
var values = new List<string> ();
values.Add("Dog");
values.Add("Cat");
var result = from x in ItemsList
where !(values.Except(x.keywords).Any())
select x;
foreach (var item in result)
{
// Check the item.ID;
}