在列表中查找其他列表中存在所有属性的对象

时间:2017-05-17 21:16:10

标签: c# linq

我有一个与此类似的数据库结构

itemID   |   attributeID
------------------------
   1     |       1
   2     |       1
   1     |       2

我需要找到一种方法来查找属性列表中匹配的所有项目。我可以使用此LINQ查询

在哪里可以选择与任何属性匹配的项目
List<int> attributes = new List<int>(){ 1, 2};

List<int> listOfItemIDs = (from item in db.ItemsToAttributes
                           where attributes.Contains(item.attributeID)
                           select item.itemID)
                           .Distinct()
                           .ToList();

此代码将返回int的列表,特别是{1,2},因为itemID 1在属性1(和2)上匹配,itemID 2在属性1上匹配。

我无法弄清楚如何获取itemID列表,该列表与属性列表中的所有项目匹配。所以在上面给出的例子中,我需要它返回JUST itemID 1,因为itemID 1在属性1和属性2上都匹配。

我一直在考虑使用IntersectExcept,但我似乎无法继续工作。

1 个答案:

答案 0 :(得分:2)

var result = db.ItemsToAttributes
               .GroupBy(x => x.itemID)
               .Where(x => !x.Select(y => y.attributeID).Except(attributes).Any() 
            && !attributes.Except(x.Select(y => y.attributeID)).Any()).Select(x => x.Key);

您希望按项目ID对它们进行分组,以便了解哪些属性ID与每个符合条件的项目ID相对应。这会为您提供IEnumerable IGrouping,其中组密钥是项ID。然后,您可以使用分组的属性ID集合,并针对属性集合进行检查。如果两个集合中都存在所有项目,则所讨论的项目ID具有所有正确的属性。最终.Select返回其属性与提供的列表匹配的项目的密钥(项目ID)。