LINQ To Entities - выбор M к M возвращает больше столбцов, чем необходимо - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующая ситуация, которая работает нормально:

IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
    {
    e.Id,
    e.Name,
     e.Date
    }).ToList();

Проверка с помощью профилей SQL, это переводит в 1 запрос SQL, который правильно извлекает Id , Имя и Дата из объединения.

Проблема возникает, когда я выполняю объединение с подключенной таблицей «многие ко многим»:

var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
{
  e.Id,
  e.Name,
  e.Date,
  e.Types.Select(t => t.Name)
  // or also just e.Types
}).ToList();

Сгенерированный запрос SQLпо некоторым причинам не только возвращает «нужные» столбцы, но возвращает все столбцы в таблице эксперимента + дополнительные указанные столбцы (то есть имена типов).

В результате получается довольно большойпотеря производительности.

Кстати, в коде, который мне позже нужно выполнить:

experimentsList.Select(e => new
{
  e.Id,
  e.Name,
  e.Date,
  Types = string.Join(", ", e.Types)
})

Поэтому мне нужен более быстрый способ иметь в памяти Id, Name, Date + список типов.

Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Можете ли вы попробовать это? Имена столбцов могут нуждаться в изменении

var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
{
  exp.Id,
  exp.Name,
  exp.Date,
  t.Name
}).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...