2011-08-01 96 views
4

例如,我有一些数据源(可能是数据库),我需要从中抽取上个月的所有记录。我正在使用LINQ。有两种可能的方式如何实现这一点:LINQ中DateTime比较的性能

第一:

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快提供者,但无法找到任何证据或解释(或disproofs)。那么,为了更好的性能,为什么使用哪种方法更好?

+0

你的分析能告诉你什么? –

+0

@Rune FS,可悲的分析并不能解释为什么...... –

+0

更正它只回答你的问题的第一部分。 –

回答

11

我会走得更远 - 海事组织将更快地为提供几乎所有供应商(至少,LINQ到对象)。当谈到索引数据 - 数据库索引通常是排序的,所以根据范围进行选择真的非常快速和容易。 >=<=没有必要的解释,它可以很快地直接跳到所需范围非常。但是,如果你是比较的年份和月份,它有两个选择:

  • 计算年/月(基于数值托换日期),并比较平等 - 并注意它可能或不能使用该索引,需要代替全扫描
  • 做一些非常聪明的想法,以确定它一个范围(使查询解析更复杂)

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