2016-09-30 53 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。