LINQ中DateTime比较的性能

时间:2011-08-01 07:11:15

标签: c# linq performance datetime comparison

例如,我有一些数据源(可能是数据库),我需要从中提取上个月的所有记录。我正在使用LINQ。有两种可能的方法来实现这一目标:

首先:

var res = from rec in _records
          where rec.RequestDateTime.Date.Year == date.Year &&
                rec.RequestDateTime.Date.Month == date.Month
          select rec;

第二个(使用直接日期比较):

var year = date.Year;
var month = date.Month;

var monthStart = new DateTime(year, month, 1);
var monthEnd = new DateTime(year, month, DateTime.DaysInMonth(year, month));

var res = from rec in _records
          where rec.RequestDateTime.Date >= monthStart &&
                rec.RequestDateTime.Date <= monthEnd
          select rec;

我听说第二个代码对大多数LINQ提供程序工作得更快,但找不到任何证据或解释(或反证)。那么,实际上哪种方式更好地用于更好的性能以及为什么?

1 个答案:

答案 0 :(得分:11)

我会更进一步 - 对于几乎所有提供商(尤其是LINQ-to-Objects),它将更快地运行。在谈论索引数据时 - 数据库索引通常是排序的,因此根据范围进行选择真的非常快速和简单。 >=<=无需解释,并且可以快速直接跳转到 very 所需的范围。但是,如果您要比较年份和月份,则有两种选择:

  • 计算年/月(基于支持日期的数值)并比较相等 - 并注意它可能会或可能不会使用索引,而是需要 完整扫描
  • 做一些非常聪明的想法,确定它 一个范围(使查询解析更复杂)

对于最简单的情况(LINQ-to-Objects),情况也是如此; >=等等是微不足道的 - 它是一种数字比较。测试月/年需要计算月/年。该数据不是作为整数显式存储的,也不是直接存在的。是的,计算时并不是过于昂贵,但在考虑日期时,它也不是免费的。