Я предполагаю, что у вас есть следующая отправная точка:
IQueryable<Invoice> _invoices;
Во-первых, вам нужно получить список всех элементов, над которыми вы будете перебирать:
IQueryable<Account> _accounts = _invoices.Select(myInvoice => myInvoice.Account).Distinct();
IQueryable<StructuredAccount> _structuredAccounts = _accounts.SelectMany(myAccount => myAccount.StructuredAccounts);
IQueryable<Structure> _structures = _structuredAccounts.Select(myStructuredAccount => myStructuredAccount.Structure).Distinct();
Затем вам нужно вернуться и присоединить ваши Structure
объекты к соответствующим Invoice
объектам.
Для этого вы:
Получить набор из {Structure, Account}
пар:
var structureAccountJoin = _structures.Join (_structuredAccounts, _structure => Structure.StructuredID, _structuredAccount => _structuredAccount.StructuredID, (структура, structdAccount) => new {Structure = структура, Account = structdAccount.Account});
Получить набор из {Structure, Invoice}
пар:
var structureInvoiceJoin = structureAccountJoin.Join (_invoices, myObj => myObj.Account.AccountID, invoice => invoice.AccountID, (myObj, invoice) => new {Structure = myObj.Structure, Invoice = invoice); счет-фактура 1025 *
Наконец, вы можете сгруппировать все по объекту Structure
:
IQueryable<IGrouping<Structure, Invoice>> groupByStructure = structureInvoiceJoin.GroupBy(obj => obj.Structure, result => result.Invoice);
(документация GroupBy: http://msdn.microsoft.com/en-us/library/bb534304.aspx)
Теперь вы можете получить доступ ко всему следующим образом:
foreach(IGrouping<Structure, Invoice> groupEntry in groupByStructure)
{
Structure currentGrouping = groupEntry.Key;
foreach(Invoice inv in groupEntry)
{
// do something;
}
}
Как примечание, это очень сложный сценарий, который требует много шагов, если у вас нет прямого доступа к таблицам. Возможно, вы захотите создать для этого StoredProcedure, так как он будет более эффективным, и вы сможете вместо этого использовать SQL-соединения. Если у вас есть только IQueryable<Invoice>
для работы и доступа к чему-либо еще, возможно, в вашей архитектуре есть проблема дизайна.
Тем не менее, это способ заставить его работать на основе ваших требований, если я правильно их прочитал.