2016-09-30 3 views
2

У меня есть объекты, которые вложены в этом порядке:Получения списка дочернего объекта вложенных несколько уровней с помощью LINQ

RootDomain 
Company 
CompaniesHouseRecord 
CompanyOfficer 

Когда даются RootDomain я хочу, чтобы создать список всех CompanyOfficers, которые имеют адреса электронной почты, но я Я не знаю, как это сделать.

Вот моя нерабочая попытка:

RootDomain rd = db.RootDomains.Find(123); 
List<CompanyOfficer> col = rd.Companies.Where(x => x.CompaniesHouseRecords.Any(chr => chr.CompanyOfficers.Any(co => co.Email != null))) 
         .Select(x => x.CompaniesHouseRecords.Select(chr => chr.CompanyOfficers)).ToList(); 

Я, очевидно, путь от марки здесь. Может ли кто-нибудь показать мне или указать мне правильный метод для этого?

+0

Возможно, вы захотите взглянуть на * Include() *. См. [Здесь] (http://stackoverflow.com/a/5718935/1525840). Имейте в виду, что существует ** две разные версии. Старый, когда вы ссылаетесь на подполе по строке и на новую, где вы используете лямбда-выражение. –

ответ

4

Как это:

RootDomain rd = db.RootDomains.Find(123); 
List<CompanyOfficer> col = rd.Companies 
    .SelectMany(c => c.CompaniesHouseRecords) 
    .SelectMany(c => c.CompanyOfficers) 
    .Where(o => null != o.Email).ToList(); 
1

Кто отвечал передо мной, но я могу показать что-то другое, что может быть более удобным для того, кто привык к БД запросов.

Использование LINQ, вы можете сделать этот тип запроса:

var officersWithEmail = from company in rd.Companies 
         from companiesHouseRecord in company.CompaniesHouseRecords 
         from companyOfficer in companiesHouseRecord.CompanyOfficers 
         where (companyOfficer.Email != null) 
         select companyOfficer; 

Некоторые люди находят это более удобным для чтения.

Если вы хотите получить в качестве вывода список <>, просто используйте .ToList для запроса.

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