Избегайте дублирования с самоссылающимися объектами в таблице Sql Server со свойством навигации Entity Framework - PullRequest
0 голосов
/ 05 июня 2018

У меня есть таблица в SqlServer, созданная, как показано ниже:

CREATE TABLE [dbo].[Reg](
    [Reg_Id] [int] IDENTITY(1,1) NOT NULL,
    [RiferimentoRRN_Reg] [int] NULL,
)

ALTER TABLE [dbo].[Reg]  WITH CHECK ADD  CONSTRAINT [FK_Reg_Reg] FOREIGN KEY([RiferimentoRRN_Reg])
REFERENCES [dbo].[Reg] ([Reg_Id])

Как вы можете видеть, у одной записи может быть связанная сущность (или нет), приходящая из той же таблицы.

Таким образом, Entity Framework создаст связанную сущность Reg, если RiferimentoRRN_Reg не равен нулю.

Как создать запрос (EF или просто SQL), который выбирает только записи со связанной сущностью или сущности, у которых нетЭто отношение без дублирующегося объекта?

Это может быть примером:

 Reg_Id  RiferimentoRRN_Reg
|  1   |                   |
|  2   |       1           |
|  3   |                   |
|  4   |       3           |
|  5   |                   |

Результат запроса должен быть:

 Reg_Id  RiferimentoRRN_Reg
|  2   |       1           |
|  4   |       3           |
|  5   |                   |

, потому что записис первичным ключом 3 и 1 ссылаются через внешний ключ, поэтому их следует избегать (на 5 никогда не ссылаются, и они должны быть включены в набор результатов).

Это позволяет мне использовать свойство навигации Entity Framework для перехода ксвязанная сущность (если имеется) избегает дублирования сущности.

Заранее спасибо и надеюсь, что мое объяснение будет достаточно ясным.

1 Ответ

0 голосов
/ 05 июня 2018

Просто быстрый запрос из моей головы.Но обратите внимание, что приведенные выше комментарии JamieD77 не будут обрабатываться в этом запросе.

SELECT D1.Reg_ID, D1.RiferimentoRRN_Reg FROM Data D1
LEFT OUTER JOIN Data D2 ON D1.Reg_ID = D2.RiferimentoRRN_Reg
WHERE D2.RiferimentoRRN_Reg IS NULL

ОБНОВЛЕНИЕ

Следующий запрос должен обрабатывать комментарий JamieDD77

SELECT D1.Reg_ID, D1.RiferimentoRRN_Reg FROM Data D1
LEFT OUTER JOIN Data D2 ON D1.Reg_ID = D2.RiferimentoRRN_Reg
WHERE (D2.RiferimentoRRN_Reg IS NOT NULL AND D1.RiferimentoRRN_Reg IS NOT NULL) 
OR (D2.RiferimentoRRN_Reg IS NULL)

Я уверен, что вы сможете легко преобразовать это в запрос LINQ.

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