正确比较LINQ中没有时间的DatetimeOffset和实体

本文关键字:DatetimeOffset 实体 没有时间 比较 LINQ | 更新日期: 2023-09-27 18:15:56

我一直在测试几种方法来比较LINQ中的两个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生成的查询更简单,因此性能更高。

这里最好的做法是什么?

正确比较LINQ中没有时间的DatetimeOffset和实体

如何处理包含的时间?

var cmpStartDate = intendedDate.AddDays(1);
var ans = SomeTable.Where(a => a.StartUtc < cmpStartDate && a.EndUtc > intendedDate.Subtract(TimeSpan.FromTicks(1)));