2016-09-30 33 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)。請記住,有**兩個**不同的版本。當你用字符串引用子字段和用lambda表達式引用新字段的時候。 –

回答

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

有人在我之前回答,但我可以顯示不同的東西,這可能是人誰是DB請求更方便。

使用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。