C# Linq包含SALL方法?

C# Linq包含SALL方法?,c#,linq,C#,Linq,我有一个项目列表,每个项目可以有多个关键字,所以我有三个表 Item -> ItemKeyword <- Keyword 我只想返回那些同时包含Dog和Cat作为关键字的项目 我不能使用contains查询,因为它实际上会返回所有带有Dog或Cat的项目 所以我想我要问的是,在linq中是否有一个叫做ContainsAll的东西,或者是否有某种方法可以实现这个功能 我尝试使用Except和Intersect,但似乎无法得到正确的结果 我希望有一个单一的查询,这样可以很容易地编译查询

我有一个项目列表,每个项目可以有多个关键字,所以我有三个表

Item -> ItemKeyword <- Keyword
我只想返回那些同时包含Dog和Cat作为关键字的项目

我不能使用contains查询,因为它实际上会返回所有带有Dog或Cat的项目

所以我想我要问的是,在linq中是否有一个叫做ContainsAll的东西,或者是否有某种方法可以实现这个功能

我尝试使用Except和Intersect,但似乎无法得到正确的结果

我希望有一个单一的查询,这样可以很容易地编译查询,但这不是一个dealbreaker

我正在使用:

网络4.5 Visual Studio 2012 C 林克 实体框架 Sql Server Ce 4.0 我不能使用contains查询,因为它实际上会返回所有带有Dog或Cat的项目

这根本不是事实。您可以将两个contains与AND&&一起使用:

或者,您可以将要查找的值放入数组中,然后使用All方法将其缩短:

var values = new [] { "Dog", "Cat" };
items.Where(item => values.All(item.Keywords.Contains));

请检查这个。。为了更好地理解,代码编写得更长。。假设每个项目都是要检查的标识符

        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;

        }

除了前进的道路,我想说——让我们看看你有什么。我期待着!largeCollection.ExceptsmallCollection.Any用于检查smallCollection中的所有内容是否都在largeCollection中。我将使用Intersect-iflargeCollection.IntersectsmallCollection.Count==smallCollection.Count应声明smallCollection中的所有项目也在largeCollection中。该选项或largeCollection.Wherex=>x、 Keywords.ContainsDog&&x.Keywords.containsScat,这样可以避免创建另一个集合,而且可读性更强,但Jon的更简洁。@JonSkeet您的示例可能是错误的吗?哦,我想应该是这样!任何@Viper:是的,这就是我的意思。哎呀。干得好,我没有把它放在回答中;
var values = new [] { "Dog", "Cat" };
items.Where(item => values.All(item.Keywords.Contains));
        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;

        }