如何使用Linq按年份筛选DateTime

本文关键字:筛选 DateTime 何使用 Linq | 更新日期: 2023-09-27 18:19:25

当我必须按日期(仅年份)进行筛选时,我在DateTime对象上使用prperty,如下所示:

var myQuery = from p in logEntryList
             where p.Logdate.Year > 2013
            select p.Title;

获取2013-12-31之后的所有参赛作品。。我的同事查看了我的代码,并将我的linq声明更正为:

var myQuery = from p in logEntryList
             where p.Logdate > Convert.ToDateTime("2013-12-31")
            select p.Title;

他评论道:"那会更好…"

我们只需要按年份而不是按日期或时间进行筛选。。结果是一样的。。但哪一个"更好"?我的解决方案真的是错误的还是糟糕的做法?

数据类型Title = String & Logdate = DateTime

如何使用Linq按年份筛选DateTime

所以,如果他的目标是优化(我的最佳猜测),他在某种程度上是正确的,但也是错误的。

在内部,DateTime不会将日期存储为年、月、日等的单独部分。相反,当您使用Year属性时,它会调用一个算法来计算DateTime的年份。

他可能想优化这个计算。然而,在他的情况下,还将为每个条目调用Convert.ToDateTime调用,这违背了目的。为了优化它,你想做这样的事情:

DateTime fromDate = Convert.ToDateTime("2014-01-01");
var myQuery = from p in logEntryList
              where p.Logdate >= fromDate
              select p.Title;

像这样简单的排序比较,而不是像使用Year这样更复杂的操作,也可以最好地映射到可能存在合格索引的数据库。因此,在正确的情况下,如果使用数据库,它不仅在CPU方面更高效,而且在I/O方面也更高效。

您的代码不会在一年的最后一天,即12/31产生任何日期。第二个片段将生成12/31午夜之后的所有日期。

您的代码是正确的(假设您不希望包含12/31,我认为您不希望),而他的代码则不是。其他事情的优先级较低。