如果我在一个列表中的一个类中有一个列表,其中的类定义如下:
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)
笔记:
当结果列表是内部类列表并且使用内部类的属性时,重复项不会回答问题,因为它们没有解决问题。
通过使用两个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 ,从而导致代码更加繁琐