例如,我有一些数据源(可能是数据库),我需要从中提取上个月的所有记录。我用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提供程序中工作得更快,但找不到任何证明或解释(或反驳)。那么,使用哪种方法可以获得更好的性能,为什么呢?
我想更进一步——在我看来,对于几乎所有的提供者(尤其是LINQ-to-Objects)来说,它会更快地工作。当讨论索引数据数据库索引通常是排序的,因此根据范围进行选择非常非常快速和容易。>=
和<=
不需要解释,可以非常快速地直接跳到所需范围。但是,如果要比较年份和月份,则有两个选择:
- 计算年/月(基于支撑日期的数字值)并比较是否相等-并注意它可能或可能不能使用索引,而是需要完整扫描
- 做一些非常聪明的思考来确定它是一个范围(使查询解析更复杂)
对于最简单的情况(LINQ-to-Objects)也是如此;>=
等是微不足道的-它是一个数字比较。测试月/年需要计算月/年。该数据没有显式地存储为整数,也不是直接在手机上。是的,计算并不过于昂贵,但是当考虑到批量日期时,它也不是免费的。