Я пытаюсь создать свое linq-to-sql выражение так, чтобы оно только генерировало единственный запрос базы данных SQL. Запрос включает два вложенных, выбирает, simplifed вирион:
var query = from person in People
where person.ID == 1234
select new PersonDetails()
{
ID = person.ID,
FirstName = person.FirstName,
LastName = person.LastName,
Addresses = from address in Addresses
where address.PersonID == person.ID
select address
PhoneNumbers = from number in PhoneNumbers
where number.PersonID == person.ID
select number
}
Выражение приведет к двум выполняемым SQL-запросам. Первый присоединяется к таблицам Person и PhoneNumbers и вытягивает запрошенную информацию от них. Второй запрос является простым выбором из таблицы Addresses. Если я комментирую свойство номеров телефона затем только единый запрос, который присоединяется к Человеку, и Адреса выполняется так, механизм L2S действительно распознает обоих отношения.
У кого-либо есть какая-либо идея, как я мог создать выражение LINQ так, чтобы linq-to-sql только генерировал единственный SQL-запрос?
(from person in Persons
join address in Addresses
on person.id equals address.personid
join phone in PhoneNumbers
on person.id equals phone.personid
select new
{
Person = person,
Address = address,
Phone = phone
})
.GroupBy(p => p.Person.id)
.Select(g => new
{
Person = g.FirstOrDefault().Person,
Addresses = g.Select(k=>k.Address).Distinct(),
PhoneNumbers = g.Select(k=>k.Phone).Distinct()
});
Вы можете использовать ключевое слово "let":
from person in context.Persons
.
.
let Add = from address in Addresses
where address.PersonID == person.ID
select address
Это действительно подзапрос.