У меня есть следующая ситуация, которая работает нормально:
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 + список типов.
Спасибо!