2011-01-20 44 views
3

在下面的LINQ查询中,我想返回在Contractors表中找到的ContractorId。并非联系人表中的所有人都在承包商表中。我真正想要的是那些满足标准的承包商的ContractorIds列表。 ContractorId与ContactId不同。如何使用多个.Select()来简化LINQ查询以返回IQueryable(int)

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

allPeople是IQueryable<Int>但contractorsWithCertsFor2010是一个IQueryable<IEnumerable<Int>>.东西是不正确那里。多重。选择()是造成IQueryable<IEnumerable<Int>>所以我在寻找一种方法来消除。选择(之一),并获得

IQueryable<Int> 

任何建议一回?谢谢!

解决方案: 一种解决方案张贴在下面的答复。我在看到那个之前创建了另一个解决方案。在我的解决方案中,我开始在Contractors表中而不是Contacts表中删除一个图层和一个.Select()语句。

回答

4

假设你只希望有联系人记录。既然你选择的唯一事情是承包商ID,你可能想试试这个承包商:

var contractorsWithCertsFor2010 = dc.Contractors 
    .Where(c => c.Contacts.Any() && c.ContractorStatus 
     .Any(cs => cs.StatusDate.Year >= 2010)) 
    .Select(c => c.ContractorId); 
+0

这就是我目前使用的。我过度思考一个相当简单的解决方案。 – DenaliHardtail 2011-01-20 17:48:10

3

首先想到:试试SelectMany来平整你的结果。因此,除了相同的代码:

//... 
.SelectMany(x => x.Contractors 
        .Select(dr => dr.ContractorId)); 

IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010); 
+0

.SelectMany工作得很好,我只是测试它。在看到你的文章之前,我回过头重写了这个查询。我现在有两个工作解决方案。再次,我过度考虑解决方案,并且多个.Select()不是必需的。谢谢! – DenaliHardtail 2011-01-20 17:42:59