当我必须按日期(仅年份)过滤时,我使用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
答案 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,我认为您不这样做),而他的代码则不然。其他一切都不太重要。