避免与具有Entity Framework导航属性的Sql Server表中的自引用实体重复

时间:2018-06-05 18:41:50

标签: c# sql sql-server entity-framework

我在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])

正如您所看到的,单个记录可以包含来自同一个表的相关实体(<或p>)。

因此,如果RiferimentoRRN_Reg不为空,Entity Framework将创建相关的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 :(得分:0)

从我脑海中快速查询一下。但请注意,上面评论的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查询。