如何使用Linq按年过滤DateTime

时间:2014-08-26 16:32:55

标签: c# linq datetime

当我必须按日期(仅年份)过滤时,我使用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

2 个答案:

答案 0 :(得分:5)

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

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

他可能想要优化这个计算。但是,在他的情况下,每个条目也会调用DateTime调用,这会使目的失效。要优化它,你需要做这样的事情:

Convert.ToDateTime

像这样的简单排序比较,而不是像使用DateTime fromDate = Convert.ToDateTime("2014-01-01"); var myQuery = from p in logEntryList where p.Logdate >= fromDate select p.Title; 这样的更复杂的操作,也最好地映射到可能存在合格索引的数据库。因此,在正确的情况下,如果您使用数据库,它不仅会更加高效,而且还会实现I / O.

答案 1 :(得分:3)

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

您的代码是正确的(假设您不希望包含12/31,我认为您不这样做),而他的代码则不然。其他一切都不太重要。