Entity Framework с несколькими объединениями и подзапросами - PullRequest
0 голосов
/ 03 мая 2019

У меня сложный запрос с несколькими левыми соединениями и подзапросами, который мне нужно реализовать в Entify Framework.Я получил монстр SQL, и моя цель - сделать это элегантно с EF.Запрос использует несколько таблиц и создает в верхней части подзапрос «WITH», который позже включается в объединения.Я сделал первый подход с EF, но когда я проверяю вывод, который EF отправляет в БД, внутренние соединения отправляются, когда я ожидаю ЛЕВЫЕ СОЕДИНЕНИЯ.

Ниже приводится сводка SQL:

WITH SUB_QUERY
     AS (  SELECT FIELD_A,
                    FIELD_B,
                    FIELD_C,
             MAX (FIELD_D) MAX_FIELD_D
             FROM TABLE_X
            WHERE SOME FIELD_A = 'WHATEVER'
         GROUP BY FIELD_A, FIELD_B, FIELD_C)
SELECT C.FIELD_A,
       C.FIELD_B,
       B.FIELD_X,
       D.FIELD_S,
       E.FIELD_J,
       F.FIELD_Y
FROM TABLE_A A
       LEFT JOIN SUB_QUERY B
          ON A.FIELD_C = B.FIELD_C
       LEFT JOIN TABLE_C C
          ON B.FIELD_A = C.FIELD_A
       LEFT JOIN TABLE_D D
          ON A.FIELD_C = D.FIELD_C
       LEFT JOIN TABLE_E E
          ON     A.FIELD_X = E.FIELD_X
       LEFT JOIN TABLE_F F
          ON A.FIELD_W = F.FIELD_W

WHERE A.FIELD_H = D.FIELD_H
       AND A.FIELD_D = B.MAX_FIELD_D

Как видите, подзапрос в верхних фильтрах и группирует некоторые данные, которые будут использованы в объединении ниже.Затем выполняются все объединения и некоторые поля извлекаются из разных таблиц в качестве результата запроса.

Какой подход вы бы порекомендовали мне для выполнения этой задачи?Я пробовал разные подходы, и ни один из них не работает (либо ничего не получается, либо много больше строк, чем SQL-запрос к БД и т. Д.)

Обратите внимание, что модель домена в Entity Framework работает правильноsetup: первичные ключи, коллекции, вложенные объекты и т. д., поэтому я считаю, что некоторые из этих объединений даже не требуются, поскольку мои сущности EF уже содержат ссылки на дочерние коллекции и родительские объекты (свойства навигации).

Спасибомного !!

1 Ответ

0 голосов
/ 03 мая 2019

если вам действительно нужно левое соединение, вы должны смоделировать условие where, связанное с левой соединенной таблицей, в соответствующем предложении on

 FROM TABLE_A A
     LEFT JOIN SUB_QUERY B
        ON A.FIELD_C = B.FIELD_C
     LEFT JOIN TABLE_C C
        ON B.FIELD_A = C.FIELD_A
     LEFT JOIN TABLE_D D
        ON A.FIELD_C = D.FIELD_C AND A.FIELD_D = B.MAX_FIELD_D 
     LEFT JOIN TABLE_E E
        ON     A.FIELD_X = E.FIELD_X
     LEFT JOIN TABLE_F F
        ON A.FIELD_W = F.FIELD_W

использование левого столбца таблицы соединений, в котором отношение заставляет работать как ВНУТРЕННЕЕ СОЕДИНЕНИЕ

...