基于日期的LINQ查询因月份更改而失败?

时间:2019-05-05 22:19:16

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

因此,我的应用程序查询数据库,并检索一个由开始和结束日期选择器选择的范围内的事件列表。一直运行良好,但现在失败了。看起来好像范围包括从上个月到本月的日期(例如上周),那只是在五月的检索事件。。。。。。。。。。。。。。。。。。。。。。。。。。。。 >

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();

2 个答案:

答案 0 :(得分:1)

此查询的逻辑根本不起作用。假设您希望在2019年4月30日至2019年1月5日之间的所有数据:2019年,大于或等于30且小于或等于1的第4个月或第5个月以及天的所有记录都将比赛。即它永远不会返回任何东西。

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

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

答案 1 :(得分:1)

让我们面对现实吧,您的代码是一团糟(善意地说)。

如果您反复使用某些内容,请为其创建别名

var date = PayPeriodStartPicker.SelectedDate.Value;

分别比较日期(分别按天,天,月和年)不是正确的方法

如果我了解您想要什么,那么您的整个表情似乎可能会像这样

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

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