C#LINQ选择项目棘手的过滤

Mar*_*tin 4 c# linq self-join

我正在使用C#3.5我有一个IList<MyItemLinkProperty>,MyItemLinkProperty表示项目与其属性(一个或多个)之间的链接.它有ItemId,PropertyId,PropertyValue.在此列表中ItemId可以多次出现,因为项目可以具有许多属性,颜色,大小等(这是一个与性能相关的问题,我有这种列表并且没有映射到项目实体).

                  ItemID  PropId  PropValue
itemProperty1 = { 1001,   1,      'Red' }
itemProperty2 = { 1001,   2,      'Small' }
itemProperty3 = { 1002,   1,      'Red' }
itemProperty4 = { 1002,   3,      'Medium' }
itemProperty5 = { 1003,   4,      'Green' }
itemProperty6 = { 1003,   2,      'Small' }
Run Code Online (Sandbox Code Playgroud)

现在我需要找到所有具有属性A和属性B的项目.例如'red'和'small'.这应该给我ItemID1001具有这两个属性.

在伪代码中我想我是在"给我属性id为1或2且项目ID相同的项目".然后我知道有两个具有这些属性的项目.

我在想一个linq查询会这样做.但是没有得到这个工作并陷入困境.也许我在这里阻止了我的思绪,过度思考它并使其过于复杂......

为此提供最佳解决方案的任何提示?

das*_*ght 5

您需要分组ItemID,然后检查每个组是否包含所有值,如下所示:

var smallRedIds = allItems
    .GroupBy(i => i.ItemID)
    .Where(g => g.Any(x => x.PropId == 1 && x.PropValue == "Red")
             && g.Any(x => x.PropId == 2 && x.PropValue == "Small"))
    .Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

这将生成具有"小"和"红色"属性的所有项目ID的枚举.