2013-10-24 6 views
1

У меня есть модель, содержащая множество вложенных коллекций. Например ...Листинг глубоко вложенных сущностей в LINQ

My Sales Record 
    Contains a collection of Customers 
    Each Customer contains a collection of Orders 
     Each Order contains a collection of Items 

Я хотел бы иметь возможность создать список всех предметов, связанных с продаж записи, не приводя к написанию вложенных циклов по каждому элементу. Я пробовал ...

var items = SalesRecord.SelectMany(r => r.Customers) 
       .SelectMany(c => c.Orders) 
       .Select(o => o.Items); 

но это не работает.

Возможно ли это в LINQ? более

+0

'SelectMany' не будет показывать результаты пока вы на самом деле не зациклитесь на наборе результатов. Вы это делаете? –

ответ

2

Один SelectMany необходимо:

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

Вы должны выравниваться результаты, в противном случае вы будете иметь коллекцию предметов коллекции. Также, если вам нужен список элементов, не забудьте позвонить ToList() в конце запроса.

+0

Вот только все предметы, не связанные с какой-либо записью о продажах – Servy

+1

@Servy есть только одна запись о продажах в этом контексте: 'SalesRecord'. –

+0

@Servy точно, это все записи о продажах –

0

Использования Select для отображения каждой записи продаж в элемент, который содержит эту запись, а также сплющенный список элементов для этой записи, используя несколько вызовов SelectMany:

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

Должно быть 'record.Customers' –

+0

@TimS. Действительно, это должно быть. – Servy

+0

@TimS. Скопировать пасту действительно получить ко мне сегодня. Это было правильно в более раннем пересмотре. Благодарю. – Servy

Смежные вопросы