Разбить выполнение выбора базы данных в Entity Framework - PullRequest
0 голосов
/ 11 сентября 2018

Этот код работает, но я хочу иметь отдельное выполнение SQL, чтобы выбрать Телефоны и ссылку на соответствующего человека. Как мне это сделать?

var persons = personsRepository.Query()
    .Select(x => new PersonDto
    {
        Name = x.Name,
        Emails = x.Emails.Select(y => y.Email),
        Phones = x.Phones.Select(y => y.Number)
    }).ToList();

Использование параметра «Включить» ниже работает - два запроса SQL выполняются: один для присоединения личных писем, а другой для личных телефонов, и у людей в конечном итоге появляется список людей с их электронными письмами и телефонами. Но я хочу ограничить выбор полей, которые мне нужны (т.е. адрес электронной почты и номер). Вот почему я предпочитаю использовать Select (проекция), как в коде выше.

var persons = personsRepository.Query()
    .Include(x => x.Emails)
    .ToList();

persons = personsRepository.Query()
    .Include(x => x.Phones)
    .ToList();

Для краткости я опускаю еще 6 сущностей, которые нужно будет включить / присоединить к человеку.

1 Ответ

0 голосов
/ 11 сентября 2018

Вы, вероятно, после SelectMany ...

IList<string> emails = personsRepository
    .Query()
    .SelectMany(x => x.Emails.Select(e => e.Email))
    .ToList();

IList<string> phoneNumbers = personsRepository
    .Query()
    .SelectMany(x => x.Phones.Select(e => e.Number))
    .ToList();

РЕДАКТИРОВАТЬ: ОК .... так что просто ...

var personEmails = personsRepository
    .Query()
    .Select(x => new PersonDto
    {
        Name = x.Name,
        Emails = x.Emails.Select(y => y.Email),
    }).ToList();

var personPhones = personsRepository
    .Query()
    .Select(x => new PersonDto
    {
        Name = x.Name,
        Phones = x.Phones.Select(y => y.Number),
    }).ToList();    

Это приведет к двум запросам. Первое объединение на Персоне и электронной почте, второе объединение на Персоне и Телефонах. По сравнению с вашей первой попыткой объединения таблиц Person, Email и Phone в одном запросе.

Если вам интересно, есть ли способ указать EF разбить один запрос LINQ на несколько запросов SQL, я бы сказал, что это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...