【问题标题】:Date based LINQ query failing with change of month?基于日期的 LINQ 查询因月份变化而失败?
【发布时间】:2019-05-05 22:19:16
【问题描述】:

所以我的应用程序查询数据库并检索落入由开始和结束日期选择器选择的范围内的事件列表。一直工作正常,但现在失败了。看起来如果范围包括从上个月到本月(比如上周)的日期,它只会检索 5 月的事件......我的眼睛因为盯着这个而融化了,但也许有人能发现我遗漏的东西?

foreach (Employee ID in activeEmployees)
            {


                var worked = (from workDays in dc.Events

                              where (workDays.Time.Day >= PayPeriodStartPicker.SelectedDate.Value.Day &&
                              workDays.Time.Month >= PayPeriodStartPicker.SelectedDate.Value.Month &&
                              workDays.Time.Year >= PayPeriodStartPicker.SelectedDate.Value.Year)
                              && (workDays.Time.Day <= PayPeriodEndPicker.SelectedDate.Value.Day &&
                              workDays.Time.Month <= PayPeriodEndPicker.SelectedDate.Value.Month &&
                              workDays.Time.Year <= PayPeriodEndPicker.SelectedDate.Value.Year)
                              && workDays.Employee == ID.ID
                              orderby workDays.Time, workDays.ID                                 
                              select workDays).ToList();

【问题讨论】:

  • 失败是什么意思?是否抛出异常?或者它只是不返回任何匹配项
  • 正如我解释的那样“看起来如果范围包括从上个月到本月的日期(比如上周),它只会检索 5 月的事件......”我发现它适用于任何范围内一个月,但不是两个月……例如 4/21-4/28 工作正常,但 4/21-5/3 似乎只返回 5 月事件

标签: c# asp.net linq-to-sql


【解决方案1】:

让我们面对现实吧,你的代码是一团糟(好心地说)。

如果您一遍又一遍地使用某些东西,请为其创建一个别名:

var date = PayPeriodStartPicker.SelectedDate.Value;

单独比较日期并不是正确的做法。

如果我理解你想要什么,那么看起来你的整个表达可能会被分解成这样:

workDays.Time >= date &&
workDays.Time <= date &&
workDays.Employee == ID.ID

如果您需要忽略时间,我建议使用EntityFunctions.TruncateTimeDateTime.Date 方法。

【讨论】:

  • 我非常感谢它,并且我本着(我认为)你想要它的精神接受它;)检查我所做的方式的原因是(我记得)来自一个建议Telerik论坛消除时间。我会试着弄清楚如何按照你的方式去做,它显然更干净......但我仍然不明白为什么新的月份会导致它失败。
  • 谢谢你的建议和善意,不要让我感觉更糟。我使用您的建议重建了查询,它们似乎运行良好。 (我是自学成才,直到我快 60 岁才开始学习编码,所以有些事情可能看起来很明显......;))再次感谢您!
  • @PaulBinCT2 一切都很好,我们都还在学习中,祝你好运
【解决方案2】:

这个查询的逻辑根本不起作用。假设您想要 30-04-2019 和 01-05-2019 之间的所有记录:所有 2019 年、第 4 个月或第 5 个月天大于或等于 30 且小于或等于 1 的记录将匹配。 IE。它永远不会返回任何东西。

我不确定你为什么得到你所看到的输出,但无论哪种方式都有问题。

我建议将日期存储为原生 DateTime,以便您可以使用其内置的比较功能。

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 2019-06-04
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多