Создайте вложенное linq-to-sql выражение, чтобы генерировать единственный SQL-запрос

Я пытаюсь создать свое 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-запрос?

1
задан sipwiz 3 August 2010 в 04:47
поделиться

2 ответа

                        (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()
                       });
1
ответ дан 2 September 2019 в 22:30
поделиться

Вы можете использовать ключевое слово "let":

from person in context.Persons
.
.
let Add = from address in Addresses 
                           where address.PersonID == person.ID
                           select address

Это действительно подзапрос.

1
ответ дан 2 September 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: