Почему Entity Framework генерирует UNION при использовании подзапросов - PullRequest
0 голосов
/ 04 апреля 2020

Я использую 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 строк.

Я что-то здесь не так делаю?

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