【问题标题】:How do I simplify a LINQ query with multiple .Select() in order to return an IQueryable(int)如何使用多个 .Select() 简化 LINQ 查询以返回 IQueryable(int)
【发布时间】:2013-01-08 03:31:38
【问题描述】:

在下面的 LINQ 查询中,我想返回在 Contractors 表中找到的 ContractorId。并非联系人表中的所有人都在承包商表中。我真正想要的是那些符合标准的承包商的 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&lt;Int&gt;,但contractsWithCertsFor2010 是 IQueryable&lt;IEnumerable&lt;Int&gt;&gt;. 有什么地方不对劲。多个 .Select() 导致 IQueryable&lt;IEnumerable&lt;Int&gt;&gt; 所以我正在寻找一种方法来消除一个 .Select() 并获得

IQueryable<Int>

有什么建议吗?谢谢!

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

【问题讨论】:

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


    【解决方案1】:

    假设您只想要具有联系记录的承包商,并且由于您选择的唯一内容是承包商 ID,您可能想试试这个:

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

    【讨论】:

    • 这是我目前正在使用的。我在想一个相当简单的解决方案。
    【解决方案2】:

    第一个想法:尝试使用 SelectMany 来平展您的结果。所以,除了:

    //...
    .SelectMany(x => x.Contractors
                      .Select(dr => dr.ContractorId)); 
    
    IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010);
    

    【讨论】:

    • .SelectMany 工作得很好,我刚刚测试过。在看到您的帖子之前,我返回并从头开始重写了查询。我现在有两个可行的解决方案。同样,我过度思考了解决方案,并且不需要多个 .Select() 。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2011-04-12
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多