Готовая загрузка не получает связанные записи с первым запросом - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот EF-запрос:

IQueryable<Repositories.Activo> activos = db.Activo.Include(a => a.ValorCampo)
                            .Where(a1 => a1.Carga.ClienteId == ClienteID && !hiddenWorkflow.Any(e => e.EstadoId == a1.EstadoId));

Где ValorCampo - это дочерняя таблица.

Хорошо .... тогда, позже в программе, у меня есть это:

        var dashboard = activos.GroupBy(a => a.Localidad);

        foreach (var activo in dashboard.Skip(model.start).Take(model.length))
        {
            foreach(var campo in campos)
            {
                var totalEstado = activo.Where(a => a.ValorCampo.Any(vc => vc.ValorCampoCaracter == vc.Campo.CampoDashboard && vc.Campo.CampoDashboard == campo.CampoDashboard)).Count();

            }
        }

хорошо, добавив «Включить» в запрос, я подумал, что фактический выполненный запрос будет включать таблицу «ValorCampo», но это не так. Или не работает при группировке? Я так не думаю.

Запрос к соответствующей таблице выполняется для каждой итерации в foreach l oop. Это неэффективно. Мне нужно, чтобы данные соответствующей информации были загружены в память с первым запросом.

Как я могу это сделать?

С уважением, Хайме

1 Ответ

0 голосов
/ 03 апреля 2020

В соответствии с этим вопросом в Stackoverflow проблема заключается в GroupBy.

Здесь объясняется та же проблема: GrouBy и Include

Существует два обходных пути в первый вопрос заключается в использовании ToList, как описано здесь, а другой - в том, чтобы поместить Include после GroupBy.

Попробуйте что-то вроде этого:

var dashboard = activos.ToList().GroupBy(a => a.Localidad);

Обратите внимание, как я вызвал ToList () для материализации запрос ....

Чтобы уточнить, что GroupBy использует отложенное выполнение, что означает, что он не материализует запрос .... Также пропустите и используйте использование отложенного выполнения, которое также НЕ материализует запрос:

Вот некоторые документы от Microsoft:

GroupBy

Пропустить

Взять

Все они используют отложенное выполнение.

Так что вам нужно вызвать ToList, FirstOrDefault, Single ... et c один из методов, который материализует запрос.

...