【问题标题】:Odd LINQ/EF Behavior when Grouping by DateTime按日期时间分组时的奇怪 LINQ/EF 行为
【发布时间】:2015-06-25 14:55:56
【问题描述】:

我有一些代码已经使用了几个月没有问题,但今天突然出现日期时间溢出错误。

原来的代码是这样的

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 数据库中检索数据可能与此相关。也许不会。

有什么建议或想法吗?

【问题讨论】:

  • p.PaymentDate的类型是什么?
  • 在数据库中它是一个日期时间,它也接受空值,所以在 C# 中,它是一个日期时间?这就是为什么我需要将它转换为 DateTime。稍后,我将该值分配为仅接受 DateTime 的对象的属性。
  • 可能是下溢,DateTime.MinValue 有问题。只是为了测试用DateTime.UtcNow替换它并检查错误是否消失。那么您的代码中的原因最少(但我无法解释原因)。
  • 有趣。 SQLCE 不理解 UtcNow,但 DateTime.Now 工作正常。我还尝试了与 MinValue 相同的 DateTime.MaxValue。最后,当我实际使用这些值时,我决定将 null 检查移到代码的后面。

标签: c# entity-framework linq datetime sql-server-ce


【解决方案1】:

在 Oliver 的一个好建议之后,我发现了这个:An overflow occurred while converting to datetime using EF4

事实证明,.Net DateTime.MinValue 超出了 SQL CE DateTime 的可能值范围。从逻辑上讲,我不认为这是一个问题,因为 1)我没有尝试将值保存回数据库 2)我从数据库中提取的值无论如何都不为空,所以 MinValue 应该' t 开始发挥作用,并且 3) 这段代码直到最近才起作用。哦,好吧,这与逻辑有什么关系?

谢谢各位。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 2014-12-19
    • 2019-11-30
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多