我有一个与此类似的数据库结构
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上都匹配。
我一直在考虑使用Intersect
或Except
,但我似乎无法继续工作。
答案 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)。