如何简化具有多个.Select()的LINQ查询,以返回IQueryable(int)?

3
在下面的LINQ查询中,我想返回在承包商表中找到的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);

allPeople是一个IQueryable<Int>,但contractorsWithCertsFor2010是一个IQueryable<IEnumerable<Int>>。这里有些不对劲。多个.Select()导致了IQueryable<IEnumerable<Int>>,因此我正在寻找一种方法来消除其中一个.Select()并获得返回值

IQueryable<Int>

有什么建议吗?谢谢!

解决方案: 下面的回复中发布了一个解决方案。在看到那个解决方案之前,我创建了另一个解决方案。在我的解决方案中,我从承包商表开始,而不是联系人表,消除了一层和一个 .Select() 语句。

2个回答

4
假设您只想选择有联系记录的承包商,而且您只选择了承包商ID,您可以尝试以下操作:
var contractorsWithCertsFor2010 = dc.Contractors
    .Where(c => c.Contacts.Any() && c.ContractorStatus
        .Any(cs => cs.StatusDate.Year >= 2010))
    .Select(c => c.ContractorId);

这是我目前正在使用的。我过于考虑了一个相当简单的解决方案。 - DenaliHardtail

3
第一个想法:尝试使用SelectMany来展平您的结果。 因此,代码相同,除了以下内容:
//...
.SelectMany(x => x.Contractors
                  .Select(dr => dr.ContractorId)); 

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

.SelectMany 运行得很好,我刚刚测试了一下。在看到你的帖子之前,我回去重新编写了查询。现在我有了两个可行的解决方案。再次感谢,我过度思考了解决方案,多个 .Select() 是不必要的。 - DenaliHardtail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接