根据过滤条件从集合中的集合中获取对象

时间:2019-01-17 13:24:09

标签: c# linq

说我有以下课程:

class Parent
{
   string Name { get; set; }
   List<Child> { get; set; }
}

class Child
{
   string Name { get; set; }
   List<GrandChild> { get; set; }
}

class GrandChild
{
   string Name { get; set; }
}

我有一个对象列表,如下所示:

// Parent list with children objects that all, also have grand children objects.
List<Parent> parent = new List<Parent>(); 

现在,我想要一个Child对象,其中其GrandChild对象的名称之一是“ John”。

由于我不知道如何从已过滤的父对象中返回子对象,因此如何使用LINQ来获取它?

(我可以使用foreach循环来获取对象,但这不是LINQ在那里的原因,以缩短代码,还是LINQ无法做到这一点?)

谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用SelectMany将Child集合展平为一个集合,然后过滤它们:

parent
    .SelectMany(p => p.Children)
    .Where(c => c.GrandChildren
        .Any(g => g.Name == "John"))

答案 1 :(得分:1)

如果您希望使用Linq查询语法进行查询,则可以使用以下方式:

from parent in parents
from child in parent.Children
where (
    from grandChild in child.Grandchildren
    where grandChild.Name == "John"
    select grandChild
).Any()
select child;

您更喜欢这种口味。