如何使用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
所以,如果他的目标是优化(我的最佳猜测),他在某种程度上是正确的,但也是错误的。
在内部,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,我认为您不希望),而他的代码则不是。其他事情的优先级较低。