通过日期时间进行分组时出现奇怪的LINQ/EF行为

问题描述:

我有一些代码,我已经使用了几个月没有问题,突然今天我得到一个日期时间溢出错误。通过日期时间进行分组时出现奇怪的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

从奥利弗一个很好的提示后,我发现这一点:An overflow occurred while converting to datetime using EF4

原来,净DateTime.MinValue是可能值的一个SQL CE日期时间范围之外。从逻辑上说,我不希望这是一个问题,因为1)我没有试图将值保存回数据库2)我从数据库中提取的值不为空,所以MinValue不应该是'这些代码已经发展到最近才开始发挥作用。哦,那么,逻辑与它有关呢?

谢谢,伙计们。

+0

确认。 SqlDateTime.MinValue工作得很好。 –