Почему при использовании наследования TPC выбирается запрос с использованием левого внешнего соединения? - PullRequest
2 голосов
/ 29 февраля 2012

В базе данных у меня есть таблицы Reservations и OldReservations, где OldReservations является копией (из таблицы Reservations) и используется для хранения старых резервирований. Вот шаги, которые я сделал для создания наследования TPC:

1) Я получил OldReservation сущность от Reservations сущности
2) Я удалил перекрывающиеся свойства из OldReservations сущности
3) Затем я сопоставил поля таблицы OldReservations в XML файла EDMX

Но когда я запускаю следующий запрос, сгенерированный sql использует LEFT OUTER JOIN, что не имеет смысла, поскольку это означает, что запрос будет возвращать только строки из таблицы OldReservations, где Reservations.ReservationID == OldReservations.ReservationID. Из статей, которые я читал, кажется, что в приведенном выше запросе должен использоваться оператор UNION, а не LEFT OUTER JOIN:

        var reservations = context.Reservations;
        foreach (var item in reservations);

Сгенерированный SQL:

SELECT CASE
         WHEN (NOT (([Project1].[C1] = 1)
                    AND ([Project1].[C1] IS NOT NULL))) THEN '0X'
         ELSE '0X0X'
       END                         AS [C1],
       [Extent1].[ReservationID]   AS [ReservationID],
       [Extent1].[ReservationDate] AS [ReservationDate],
       [Extent1].[ContactID]       AS [ContactID],
       [Extent1].[EventID]         AS [EventID],
       [Extent1].[RowVersion]      AS [RowVersion]
FROM   [dbo].[Reservations] AS [Extent1]
       LEFT OUTER JOIN (SELECT [Extent2].[ReservationID] AS [ReservationID],
                               cast(1 as bit)            AS [C1]
                        FROM   [dbo].[OldReservations] AS [Extent2]) AS [Project1]
         ON [Extent1].[ReservationID] = [Project1].[ReservationID]

Запрос выбора TPC с использованием левого внешнего соединения не имеет смысла, так что я делаю неправильно при создании наследования TPC?

спасибо

1 Ответ

2 голосов
/ 29 февраля 2012

Вот как TPC должен работать. Reservation - это конкретный тип, поэтому свойства в Reservation хранятся в таблице Reservations. OldReservation также является конкретным типом, поэтому свойства в OldReservation , которые еще не сопоставлены , хранятся в таблице OldReservations.

То, что вы хотите, похоже, но не совсем то же самое. Сделайте Reservation абстрактный тип и переименуйте его в ReservationBase. Затем создайте производный тип Reservation. Теперь OldReservation больше не наследуется от конкретного типа, поэтому все собственные свойства и унаследованные свойства OldReservation будут сопоставлены с таблицей OldReservations.

После этого yourContext.ReservationBases можно использовать для получения Reservations и OldReservations, и для этого следует использовать UNION (ALL).

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