Как объединить эти два запроса 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;
Дайте мне знать, если я что-то пропустил.