如何使用Linq按年过滤DateTime

Edi*_* G. 0 c# linq datetime

当我必须按日期(仅年份)过滤时,我使用DateTime对象上的prperty,如下所示:

var myQuery = from p in logEntryList
             where p.Logdate.Year > 2013
            select p.Title;
Run Code Online (Sandbox Code Playgroud)

获取2013-12-31之后的所有条目..我的同事审核了我的代码,并将我的linq语句更正为:

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

他的评论是:"会更好......"

我们只需按年份过滤而不是按日期或时间过滤..结果是相同的......但哪一个更好?我的解决方案真的错了还是坏的做法?

数据类型 Title = String & Logdate = DateTime

Cor*_*son 5

所以,如果他的目标是优化(我最好的猜测),那他就是在正确的轨道上,但也是错的.

在内部,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;
Run Code Online (Sandbox Code Playgroud)

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

  • 将2014-01-01用于`fromDate`,然后使用`> =`不是更好吗?否则,2013年最后一天的结果将显示在原始查询中,而不是基于原始查询. (2认同)