gpt4 book ai didi

C#:为什么我的 SQL 查询中缺少 .Where() 条件之一?

转载 作者:太空狗 更新时间:2023-10-30 00:29:53 25 4
gpt4 key购买 nike

我有一个正在运行以下代码行的方法。它应该获取过去 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)

最佳答案

这是 2.0 之前的 EF Core 版本中 SQL 查询转换的问题(不支持 DateTime 方法,如 AddHoursAddDays 等)导致所谓的client evaluation .您的查询应该会产生正确的结果,但效率会很低,因为 where 过滤器的第二部分将在检索到与其他条件匹配的所有记录后在内存中进行评估。

已在EF Core 2.0中得到改进生成的 SQL 看起来像这样(如预期的那样):

SELECT [message].[Id], [message].[CreationTime], [message].[Value]
FROM [Messages] AS [message]
WHERE ([message].[CreationTime] >= DATEADD(hour, -24E0, GETUTCDATE())) AND ([message].[CreationTime] <= GETUTCDATE())

因此,要么升级到 EF Core 2.0,要么使用通常的 EF 解决方法,将 DateTime.UtcNow.AddHours(-24) 放入查询外部的变量中,然后在内部使用它。

关于C#:为什么我的 SQL 查询中缺少 .Where() 条件之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45753888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com