Как объединить эти два запроса 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 ответов


предполагая, что я понимаю, что вы пытаетесь сделать, вы можете сделать что-то вроде этого:

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

обратите внимание, что вы уже не фильтруете компанию (вы просто получаете первую компанию, у которой есть кто-то с этим именем, что, если есть кратные? Если это невозможно, то проверка компании бесполезна, и вы можете также сделать, как и я, и просто выбрать всех людей, а затем фильтровать это вместо того, чтобы входить в каждую компанию, проверяя, есть ли там человек, а затем как-то вверх и вниз!)


для того, чтобы найти 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)


FirstOrDefault и SingleOrDefault:

имена вряд ли будут уникальными: одна компания может иметь более одного "Джон Смит" работает на них; один bidInfo может содержать несколько Companies, более чем один из которых каждый использует различные "Джейн Смит".

SingleOrDefault() выдаст исключение, если есть более одного элемента, который соответствует p.Name == bidInfo.ArchitectPerson.Name критерий.

пока" случаи Смита", описанные выше, описывают приемлемое состояние для вашей программы, используйте FirstOrDefault().


Если я правильно понимаю, вы пытаетесь найти первую компанию с человеком, который имеет то же имя, что и архитектор, а затем вернуть оба.

если да, то я думаю, что это сработает:

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;

Дайте мне знать, если я что-то пропустил.