Я использую EF6 и не являюсь экспертом в Entity Framework, но мне это кажется странным. Я профилировал следующий запрос (упрощенный для ясности):
(from recipe in Recipe.Where(x => x.IsActive)
from picture in RecipePicture.Where(x => x.ItemId == recipe.ItemId).DefaultIfEmpty()
from category in RecipeCategory.Where(x => x.RecipeCategoryId == recipe.CategoryId).DefaultIfEmpty()
select new
{
Recipe = recipe,
Picture = picture,
Category = category,
Ingredients = RecipeIngredient.Where(x => x.ItemId == recipe.ItemId).ToList(),
Allergies = RecipeAllergy.Where(x => x.ItemId == recipe.ItemId).ToList(),
}).AsNoTracking().ToList()
И сгенерированный SQL выглядит примерно так:
SELECT
FROM Recipe as r
INNER JOIN RecipePicture as p ON p.ItemId = r.ItemId
INNER JOIN RecipeCategory as c ON c.ItemId = r.ItemId
INNER JOIN RecipeIngredient as i ON c.ItemId = r.ItemId
UNION ALL
SELECT
FROM Recipe as r
INNER JOIN RecipePicture as p ON p.ItemId = r.ItemId
INNER JOIN RecipeCategory as c ON c.ItemId = r.ItemId
INNER JOIN RecipeAllergy as a ON c.ItemId = r.ItemId
Это делает UNION
на 2 SELECT
почти идентичны, за исключением того факта, что каждый из них присоединяется к отдельному подзапросу. Похоже, что это может быть проблема производительности, когда снова и снова выбираются одни и те же строки, когда в этом нет необходимости.
В моем реальном запросе у меня есть еще много подзапросов, которые привели к гигантскому c SQL утверждение более 60000 строк.
Я что-то здесь не так делаю?