Избегайте дублирования с объектами саморегуляции в таблице Sql Server с атрибутом навигации Entity Framework

Brando B Caserotti спросил: 12 мая 2018 в 05:01 в: c#

У меня есть таблица в 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 ответ

Есть решение
Ryan Gunn ответил: 12 мая 2018 в 05:59

Просто быстрый вопрос из головы. Но обратите внимание, что комментарий 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

UPDATE

Ниже приведенный запрос должен обрабатывать JamieDD77's comment

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.

Brando B Caserotti ответил: 12 мая 2018 в 08:17
Это отлично пригвождало. спасибо