流畅的LINQ - 选择包含子项列表的父项列表,其中包含子项的子集

aas*_*uki 5 c# sql linq fluent

那个头衔是最糟糕的......

无论如何,我要做的是选择一个包含n个子对象的父对象.我将传递子对象必须匹配的标准列表(1..n).为了简洁起见,这里是我正在使用的课程:

public class Parent {

     public int Id { get; set; }

     public List<Child> Children { get; set; }

}

public class Child { 

    public int Id { get; set; }

    public int ParentId { get; set; }

    public int SomeValue { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个包含孩子的父母列表,这些孩子与我传入的所有SomeValues相匹配

所以,如果我有:

Parent 1
    Child 1, SomeValue 10
    Child 2, SomeValue 20
    Child 3, SomeValue 40
Parent 2
    Child 4, SomeValue 10
    Child 5, SomeValue 20
    Child 5, SomeValue 50
Run Code Online (Sandbox Code Playgroud)

并且myList是[10,50],它只需要返回Parent 2.如果myList是[10,20],则应返回父母双方.最后,如果myList是[10,20,60],则不应该返回任何内容.

我认为以下内容不起作用,因为子列表中不包含的值将从结果中删除(对吗?)

parents.where(p => p.children.all(c => myList.contains(c.SomeValue)));
Run Code Online (Sandbox Code Playgroud)

任何一个都不会起作用,因为只要其中一个孩子匹配,它就会返回任何东西.我需要确保父项具有匹配myList中每个项目的子项.我还考虑添加一个计数来确保匹配的项目至少与myList.length一样大,但是这可能不起作用,因为SomeValue不必在子集合中是不同的(我想我可以运行一个孩子的SomeValues上有不同的子选项?)

Ree*_*sey 8

您可以翻转条件,并检查以确保所有列表值都包含在Children集合中:

var matches = parents.Where(p => myList.All(v => p.Children.Select(c => c.SomeValue).Contains(v)));
Run Code Online (Sandbox Code Playgroud)

  • 使用`Any`子句而不是`.Select().Contains`会更简洁:`p.Children.Any(c => c.SomeValue == v)` (2认同)