【发布时间】:2017-08-18 10:00:38
【问题描述】:
我有一个正在运行以下代码行的方法。它应该获取在过去 24 小时内创建的所有消息,并且不会在将来创建(因为这不应该是可能的)。
messages.AddRange(_dbcontext.Messages
.Where(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24) && message.CreationTime <= DateTime.UtcNow)
.ToList());
当应用程序运行并通过上述行时,这是运行的 SQL 查询:
SELECT [message].[Id], [message].[CreationTime], [message].[Value]
FROM [Messages] AS [message]
WHERE([message].[CreationTime] <= GETUTCDATE())
这基本上检索所有消息,而不是在过去 24 小时内创建的消息。
我想知道为什么 Where() 的这一部分被忽略或没有被转换为 SQL 查询,以及我可以做些什么来使它工作。
(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24)
【问题讨论】:
-
我认为这两个查询结果与都为您提供最近 24 小时记录的数据相同。我不确定实体框架优化是否可以做到这一点。
-
@AmitSingh 该 SQL 查询如何只返回最近 24 小时的记录?
-
尝试声明一个分配此日期的变量
DateTime.UtcNow.AddHours(-24),并在您的实体查询中使用此变量。 AFAIK 实体无法直接翻译此内容 -
@Misery 这也是我的想法,但问题就变成了为什么实体框架(这是实体框架,不是吗?@SimonP?)抱怨这一点,就像它处理其他事情一样无法转换。
-
@LasseV.Karlsen 如果列中存储的日期是 utc 格式。
标签: c# sql entity-framework