LINQ to SQL查询返回重复项

3

我有一个Premiums表,正在尝试使用以下LINQ-to-SQL进行查询:

var premiums = sourcePolicyContext.Premiums.Where(prm => prm.Policy_Number == "07748106");

这会执行以下SQL语句对数据库进行操作:
exec sp_executesql N'SELECT [t0].[Policy Number] AS [Policy_Number], ' + 
                           '[t0].[PremiiumType] AS [Premiium_Type], [t0].[Number], ' +
                           '[t0].[Effective Date] AS [Effective_Date], ' + 
                           '[t0].[Entry Date] AS [Entry_Date], ' +
                           '[t0].[Collision Premium] AS [Collision_Premium], ' +
                         '[t0].[Non Collision Premium] AS [Non_Collision_Premium], ' +
                           '[t0].[Tow Premium] AS [Tow_Premium], ' +
                      '[t0].[Other Coverage1 Premium] AS [Other_Coverage1_Premium] ' +
                    'FROM [dbo].[Premium Table] AS [t0]' +
                    'WHERE [t0].[Policy Number] = @p0', 
                   N'@p0 nvarchar(4000)',
                     @p0=N'07748106'

这个查询在直接运行时返回两行,符合预期。然而,在LINQ to SQL中,它也会返回两个实体,但是这两个实体中的数据只是SQL查询结果中第一行的重复。为什么会出现这种情况呢?


1
使用“premiums”的代码是什么样子的? - dlev
这段代码只是一个测试行。我已经在断点处设置了它,并通过展开结果来强制评估查询。我正在测试它,因为系统中其他地方的代码会迭代父表到Premium,并迭代该父表中的每个Premium,然后使用保费值执行计算。由于这种行为,计算产生了无效的结果。 - Starr
因为查询 select * from [dbo].[Premium Table] where [Policy Number] = '07748106' 返回两行。这两行由该查询和存储过程返回,彼此不同。不同的保费值、不同的保费类型等等... 然而,似乎 LINQ-to-SQL 认识到有两个结果,但是将两个结果实体都填充了来自第一个返回行的数据。 - Starr
1
你的表中哪一列是主键? - Pieter Müller
@Harikawashi - 是的,我同意你的看法 - 我假设ORM实体正在使用Policy_Number,而已经说明它是非唯一的。 - Clockwork-Muse
显示剩余5条评论
1个回答

3

不确定这是否有帮助,但如果你还没有,尝试给表一个专门的唯一标识列,并将其设置为主键。确保你的LINQ-TO-SQL定义知道主键列。


已解决。不确定为什么需要这么做,因为我在ORM设计师中设置的自然键已经是唯一的了,所以我不应该需要一个代理键。谢谢! - Starr
@Starr 你说得没错,那应该就不需要自然键了。我建议你再检查一下你的Equals()方法和相关定义以确保正确性。此外,考虑实现IComparable接口如何? - Clockwork-Muse
我们遇到了这个问题,并发现有人在映射中将错误的列指定为主键。 - DCShannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接