如何从带有子项的父对象列表中提取数据?

The*_*der 1 c# linq

如果我在一个列表中的一个类中有一个列表,其中的类定义如下:

class Class1
{
    public int Id { get; set; }

    public List<Class2> Class2s { get; set; }
}

class Class2
{
    public string Name { get; set; }

    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个类型的列表,Result其中Result是:

class Result
{
    public int Class1Id { get; set; }

    public string Name { get; set; }

    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Result该类包含来自Class1和 的值Class2

像这样:

var results = new List<Result>();
foreach (var class1 in class1s) //class1s is a List of Class1
{
    foreach (var class2 in class1.Class2s)
    {
        results.Add(new Result()
        {
            Class1Id = class1.Id,
            Name = class2.Name,
            Value = class2.Value,
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过 linq 查询做到这一点?

我尝试了以下方法:

IList<Result> list = class1s.Select(c => c.Class2s.Select(c2 => new Result()
{
    Class1Id = c.Id,
    Type = c2.Type,
    Name = c2.Name,
}).ToList()).ToList();
Run Code Online (Sandbox Code Playgroud)

但这失败并出现错误:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.List<Results>' to 'System.Collections.Generic.IList<Results>'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

笔记:

当结果列表是内部类列表并且使用内部类的属性时,重复项不会回答问题,因为它们没有解决问题。

Pan*_*vos 6

通过使用两个from语句,可以轻松地以查询格式从父子列表中检索数据

var results = from parent in class1s
              from child in parent.Class2s 
              select new Result {
                    Class1Id = parent.Id,
                    Name = child.Name,
                    Value = child.Value,
              };
var list=results.ToList();
Run Code Online (Sandbox Code Playgroud)

在流畅的格式中,您可以使用 SelectMany

var list = class1s.SelectMany(parent => parent.Class2s,
                              (parent,child)=>
                                           new Result {
                                              Class1Id = parent.Id,
                                              Name = child.Name,
                                              Value = child.Value
                                          }
           ).ToList();
Run Code Online (Sandbox Code Playgroud)

出于显而易见的原因,我更喜欢第一种形式

请注意,我使用了接受结果选择器的SelectMany重载。如果没有它,我将不得不Select在第一个选择器函数中使用 a ,从而导致代码更加繁琐