C# 如何使用Linq按年筛选DateTime

C# 如何使用Linq按年筛选DateTime,c#,linq,datetime,C#,Linq,Datetime,当我必须按日期(仅年)进行筛选时,我会对DateTime对象使用如下属性: var myQuery = from p in logEntryList where p.Logdate.Year > 2013 select p.Title; DateTime fromDate = Convert.ToDateTime("2014-01-01"); var myQuery = from p in logEntryList

当我必须按日期(仅年)进行筛选时,我会对DateTime对象使用如下属性:

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

var myQuery = from p in logEntryList
              where p.Logdate >= fromDate
              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
调用,这与目的背道而驰。要优化它,您需要执行以下操作:

var myQuery = from p in logEntryList
             where p.Logdate.Year > 2013
            select p.Title;
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,我假设您不想),而他的代码则不正确。其他所有内容的优先级较低。

如果日志日期不是日期,而是时间,那么查询将给出不同的结果。第二个查询将包括2013-12-13IMO上的日志,它们都一样好。不确定他的观点是什么。对每次执行时间进行比较。您编写的初始代码将比第二个代码(由您的朋友提供)快7倍。我考虑了一个包含1000个样本的列表,但情况并非如此,因为原始查询的结果将在2014年1月1日午夜开始,而“更正”版本的结果将在2013年12月31日午夜之后开始。根据所包含的数据,结果可能不同(不正确)。正如答案中所指出的,有更快的方法可以做到这一点。@mason,是的,我是不准确的。“更正”的版本是绝对错误的!!!它将包括“2013年12月31日”的结果。如果将2014-01-01用于
fromDate
,然后使用
=
,不是更好吗?否则,2013年最后一天的结果将显示在中,而根据原始查询,结果似乎不是预期的。@梅森,你是对的。我在优化他的代码,但没想到要纠正它!我已经更新了答案。谢谢你的回答。微小的变化可以带来巨大的变化。linq状态下的转换肯定是错误的:)+1、那是绝对正确的。第二个比较将包括12月最后一天的记录以及真实的日本。。幸运的是,我们只有00:00:00的记录。