【问题标题】:LINQ to SQL query returning duplicatesLINQ to SQL 查询返回重复项
【发布时间】:2011-11-03 06:17:44
【问题描述】:

我有一个 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 查询结果中第一行的副本。为什么会发生这种情况?

【问题讨论】:

  • 使用premiums的代码是什么样的?
  • 代码只是测试行。我将其设置断点并通过扩展结果来强制评估查询。我正在测试它,因为我在系统中的其他地方有代码迭代父表到溢价,并迭代该父表中的每个溢价,然后使用溢价值来执行计算。由于这种行为,计算产生了无效结果。
  • 为什么查询直接运行会返回两行?
  • 因为查询select * from [dbo].[Premium Table] where [Policy Number] = '07748106' 返回两行。该查询和存储过程返回的两行彼此不同。不同的保费值、不同的保费类型等...但是 LINQ-to-SQL 似乎识别出有两个结果,但仅使用来自第一个返回行的数据填充两个结果实体。
  • 你的表中哪一列是主键?

标签: c# sql linq linq-to-sql


【解决方案1】:

不确定这是否会有所帮助,但如果您还没有,请尝试为表指定一个专用的唯一标识列并将其设置为主键。确保您的 LINQ-TO-SQL 定义了解主键列。

【讨论】:

  • 做到了。不知道为什么有必要,我在 ORM 设计器中设置的自然键已经是唯一的,所以我不应该需要代理键。谢谢!
  • @Starr 你说得对,这应该消除了自然键的必要性。我会检查您的 Equals() 方法和相关定义,以防万一。另外,如何实现IComparable
  • 我们遇到了这个问题,发现有人在映射中指定了错误的列作为主键。