C# 在LINQ中列出深度嵌套的子实体

C# 在LINQ中列出深度嵌套的子实体,c#,linq,C#,Linq,我有一个包含许多嵌套集合的模型。例如 My Sales Record Contains a collection of Customers Each Customer contains a collection of Orders Each Order contains a collection of Items 我希望能够创建与销售记录关联的所有项目的列表,而不会导致编写嵌套的foreach循环。我试过 var items = SalesRecord.SelectMa

我有一个包含许多嵌套集合的模型。例如

My Sales Record
  Contains a collection of Customers
    Each Customer contains a collection of Orders
      Each Order contains a collection of Items
我希望能够创建与销售记录关联的所有项目的列表,而不会导致编写嵌套的foreach循环。我试过

var items = SalesRecord.SelectMany(r => r.Customers)
               .SelectMany(c => c.Orders)
               .Select(o => o.Items);
但这不起作用


这在LINQ中可以实现吗?

还需要一个选择:

var items = SalesRecord.Customers // simply select customers from record
               .SelectMany(c => c.Orders)
               .SelectMany(o => o.Items); // here

您需要展平结果,否则您将拥有项目集合集合。另外,如果您需要项目列表,请不要忘记在查询结束时调用
ToList()

使用
Select
将每个销售记录映射到包含该记录的项目以及该记录的扁平项目列表中,通过多次调用
SelectMany

var items = SalesRecord.Select(record => new
{
    record,
    Items = record.Customers
        .SelectMany(c => c.Orders)
        .SelectMany(o => o.Items),
});

SelectMany
在您实际循环使用结果集之前不会显示结果。你在这么做吗?这只是所有的商品,与销售无关record@Servy在此上下文中只有一个销售记录:
SalesRecord
@Servy确切地说,这是所有销售项目record@Servy他的文字描述“我的销售记录”和财产名称,
SalesRecord
,表示单数,而他的代码“不起作用”意味着复数。我猜它实际上是单数,但你是对的,
SelectMany
的意思是相反的,直到你指出这一点,我才注意到。这对我来说是有效的。销售记录确实有一组客户,但我认为是销售记录的声明。SelectMany(r=>r.Customers)这导致了我最初的代码中的一个问题。我想,我已经尝试了.Select(),.SelectMany()的几乎所有组合但在我的困惑中,显然没有找到合乎逻辑的答案。感谢大家的帮助。应该是
记录。客户
@TimS。确实应该是。@TimS。今天我真的很喜欢复制粘贴。它在早期版本中是正确的。谢谢。