在下面的LINQ查询中,我想返回在Contractors表中找到的ContractorId。并非Contacts表中的所有人都在Contractors表中。我真正想要的是符合标准的承包商的ContractorIds列表。 ContractorId与ContactId不同。
var contractorsWithCertsFor2010 = dc.Contacts.Where(x => x.Contractors
.Any(d => d.ContractorStatus
.Any(date => date.StatusDate.Year >= 2010)))
.Select(x => x.Contractors
.Select(dr => dr.ContractorId));
IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010);
所有人都是IQueryable<Int>
但是承包商和凯特2010年是IQueryable<IEnumerable<Int>>.
有些东西不对。多个.Select()导致IQueryable<IEnumerable<Int>>
所以我正在寻找一种方法来消除其中一个.Select()并返回
IQueryable<Int>
有什么建议吗?谢谢!
解决方案: 一个解决方案发布在下面的回复中。在看到那个之前我创建了另一个解决方案。在我的解决方案中,我从Contractors表而不是Contacts表开始,消除了一层和一个.Select()语句。
答案 0 :(得分:4)
假设您只希望承包商有联系记录,并且您选择的唯一内容是承包商ID,您可能想尝试这样做:
var contractorsWithCertsFor2010 = dc.Contractors
.Where(c => c.Contacts.Any() && c.ContractorStatus
.Any(cs => cs.StatusDate.Year >= 2010))
.Select(c => c.ContractorId);
答案 1 :(得分:3)
首先想到:尝试使用SelectMany来展平您的结果。所以,相同的代码除了:
//...
.SelectMany(x => x.Contractors
.Select(dr => dr.ContractorId));
IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010);