在LINQ to Entities中正确地比较没有时间的DateTimeOffset

4

我一直在测试比较两个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生成的查询更简单,因此更高效。

在这里最好采取什么行动呢?


使用“日期”属性将时间截断到午夜,然后获取日期之间的差异。计算机中的DateTime以双精度浮点数形式存储,整数部分是自1900年1月1日以来的天数,小数部分是当前时间/24(即3.5小时/24小时)。 - jdweng
@jdweng L2E 不支持 Date 属性。 - Ivan Stoev
1个回答

0

尝试一下对包含的时间进行巧妙处理怎么样?

var cmpStartDate = intendedDate.AddDays(1);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接