2011-11-02 180 views
3

我有我嘗試使用來查詢保費表下面的LINQ到SQL: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

+0

代碼只是一條測試線。我已經突出了它,並通過擴展結果來強制對查詢進行評估。我正在測試它,因爲系統中的其他地方的代碼將父表格迭代到Premium表中,並對該父表中的每個Premium進行迭代,然後使用高級值執行計算。由於這種行爲,計算產生了無效的結果。 – Starr

+0

爲什麼直接運行時查詢會返回兩行? –

回答

3

不確定這是否有幫助,但是如果您還沒有,請嘗試爲表提供專用的唯一標識列並將其設置爲主鍵。確保你的LINQ-TO-SQL定義知道主鍵列。

+0

這樣做。不知道爲什麼它是必要的,我在ORM設計器中設置的自然鍵已經是唯一的,所以我不應該需要代理鍵。謝謝! – Starr

+0

@Starr你是對的,這應該已經消除了自然鑰匙的必要性。我會檢查你的'Equals()'方法和相關的定義,以防萬一。另外,如何實現'IComparable'? –

+0

我們遇到了這個問題,發現有人在映射中指定了錯誤的列作爲主鍵。 – DCShannon