2015-06-25 45 views
1

我有一些代碼,我已經使用了幾個月沒有問題,突然今天我得到一個日期時間溢出錯誤。通過日期時間進行分組時出現奇怪的LINQ/EF行爲

原來的代碼看起來像這樣

var payments = (from p in context.Payments 
       where p.PaymentType == "Direct" 
        && p.ExportFile == null 
       group p by new { p.Customer, p.DebtorID, p.ReceiptNumber, p.PaymentDate } into g 
       select new 
         { 
          g.Key.Customer, 
          g.Key.DebtorID, 
          amount = g.Sum(b => b.Amount) * -1, 
          ReceiptNumber = g.Key.ReceiptNumber ?? default(long), 
          PaymentDate = g.Key.PaymentDate != null ? (DateTime)g.Key.PaymentDate : DateTime.MinValue 
         }).ToList(); 

請告訴我奇怪的是,在這個特殊的情況下,代碼只選擇一行數據,看起來像這樣:

ID CUSTOMER DEBTORID AMOUNT RECEIPTNUMBER EXPORTFILE PAYMENTTYPE PAYMENTDATE 
99 183245  672   5  419    NULL  Direct  2015-06-10 00:00:00.000 

漂亮的直線前進。日期沒有錯。

陌生人仍然,如果我做選擇沒有分組,它工作正常。

var payments = (from p in context.Payments 
     where p.PaymentType == "Direct" 
     && p.ExportFile == null 
     select new 
     { 
      p.Customer, 
      p.DebtorID, 
      p.Amount, 
      p.ReceiptNumber, 
      PaymentDate = (DateTime)p.PaymentDate 
     }).ToList(); 

那麼,什麼給了?就像我說的,代碼通常工作正常,這使我相信數據有問題。但數據看起來也不錯。從SQL Server CE數據庫檢索我的數據可能是相關的。也許不會。

任何意見或建議?

+0

「p.PaymentDate」的類型是什麼? – Steve

+0

在數據庫中它是一個日期時間,它也接受null,所以在C#中,它是一個DateTime?這就是爲什麼我需要將它轉換爲DateTime。稍後,我將該值指定爲僅接受DateTime的對象的屬性。 –

+1

也許這是一個下溢,並且'DateTime.MinValue'有一些問題。只是爲了測試將它替換爲'DateTime.UtcNow'並檢查錯誤是否消失。那麼你的代碼中會有最少的原因(但我無法解釋原因)。 – Oliver

回答

0

從奧利弗一個很好的提示後,我發現這一點:An overflow occurred while converting to datetime using EF4

原來,淨DateTime.MinValue是可能值的一個SQL CE日期時間範圍之外。從邏輯上說,我不希望這是一個問題,因爲1)我沒有試圖將值保存回數據庫2)我從數據庫中提取的值不爲空,所以MinValue不應該是'這些代碼已經發展到最近纔開始發揮作用。哦,那麼,邏輯與它有關呢?

謝謝,夥計們。

+0

確認。 SqlDateTime.MinValue工作得很好。 –

相關問題