如何使用多个.Select()简化LINQ查询以返回IQueryable(int)

时间:2011-01-20 17:08:25

标签: linq entity-framework entity-framework-4

在下面的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()语句。

2 个答案:

答案 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);