如何将这两个linq查询合并到一个查询中?

时间:2016-04-22 02:35:25

标签: c# linq

如何将其添加到一个查询中?我想要的是公司中与我正在搜索的人的姓名相匹配的人。

目前我获得了公司,然后运行基本相同的搜索。

var existingCompany = bidInfo.Companies
        .FirstOrDefault( c=> c.CompanyDomain != null && 
                           c.CompanyDomain.People.FirstOrDefault( 
                                 p => p.Name == bidInfo.ArchitectPerson.Name ) 
                                        != null);
Person existingPerson=null;
if (existingCompany !=null)
{
     existingPerson = existingCompany.CompanyDomain.People.FirstOrDefault(p => p.Name == bidInfo.ArchitectPerson.Name);
}

3 个答案:

答案 0 :(得分:7)

假设我理解你要做的事情,你可以这样做:

var person = bidInfo.Companies
            .Where(c=>c.CompanyDomain != null)
            .SelectMany(c=>c.CompanyDomain.People)
            .SingleOrDefault(p=>p.Name == bidInfo.ArchitectPerson.Name);

请注意,您已经没有过滤公司了(您只是让第一家拥有该名称的公司,如果有倍数会怎么样?如果那不可能,那么公司检查是没用的,你可以像我一样做,只选择所有人然后过滤,而不是进入每个公司内部,检查这个人是否在那里,然后以某种方式上升和下降!)

答案 1 :(得分:5)

要从Person中找到与您正在搜索的Company的名称相匹配的bidInfo.ArchitectPerson,您需要查看所有人与bidInfo关联的公司,然后找到匹配名称的人。

这可以通过以下方式完成:

var existingPerson = bidInfo.Companies
    .Where(c => c.CompanyDomain != null && c.CompanyDomain.People != null)
    .SelectMany(c => c.CompanyDomain.People)
    .FirstOrDefault(p => p.Name == bidInfo.ArchitectPerson.Name)


FirstOrDefaultSingleOrDefault

名称不太可能是独一无二的:一家公司可能拥有多个名称" John Smith"为他们工作;一个bidInfo可以包含多个Companies,其中不止一个人使用不同的" Jane Smith"。

如果有多个元素符合p.Name == bidInfo.ArchitectPerson.Name条件,

SingleOrDefault()将抛出异常。

只要"史密斯案例"上面概述的描述了您的计划的可接受状态,请使用FirstOrDefault()

答案 2 :(得分:2)

如果我理解正确,您正在尝试找到第一家与该建筑师同名的公司,然后返回这两家公司。

如果是这样,那么我认为这将有效:

var query =
    from c in bidInfo.Companies
    from p in c.CompanyDomain.People
    where p.Name == bidInfo.ArchitectPerson.Name
    select new { c, p };

var first = query.FirstOrDefault();

Company existingCompany = first?.c;
Person existingPerson = first?.p;

如果我错过了什么,请告诉我。