我一直在测试一些方法来比较LINQ to Entities中的两个DateTimeOffset
对象,但我不确定哪一个是最有效的,也是实际的正确方法。
我尝试了以下内容:
SomeTable.Where(a => DbFunctions.TruncateTime(a.StartUtc) <= intendedDate && DbFunctions.TruncateTime(a.EndUtc) >= intendedDate);
为比较生成了这个大的复杂查询:
((convert (datetimeoffset, convert(varchar(255), [Extent1].[StartUtc], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[StartUtc], 121), 6) , 102)) <= @p__linq__1) AND ((convert (datetimeoffset, convert(varchar(255), [Extent1].[EndUtc], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[EndUtc], 121), 6) , 102)) >= @p__linq__2)
还尝试了DiffDays
,它生成了一个更易读的查询
((DATEDIFF (day, [Extent1].[StartUtc], '2016-11-01 00:00:00 -02:00')) >= 0) AND ((DATEDIFF (day, '2016-11-01 00:00:00 -02:00', [Extent1].[EndUtc])) >= 0)
但是这个查询需要花费时间,我不能拥有它。
我不是专家,但对于这样一个简单的要求,第一个查询看起来真的很长很复杂。是这种情况,我应该使用原始SQL而不是LINQ与EF?我无法确定哪种方法最有效。
我觉得CAST('2016-11-02 00:00:00 AM -02:00' AS DATE)
更简单,因此比EF生成的查询更高效。
这里最好的做法是什么?
答案 0 :(得分:0)
如果被包含的时间变得棘手?
var cmpStartDate = intendedDate.AddDays(1);
var ans = SomeTable.Where(a => a.StartUtc < cmpStartDate && a.EndUtc > intendedDate.Subtract(TimeSpan.FromTicks(1)));