Sim*_*n P 4 c# sql entity-framework
我有一个方法,运行以下代码行.它应该获取在过去24小时内创建的所有消息,并且不会在将来创建(因为这不可能).
messages.AddRange(_dbcontext.Messages
.Where(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24) && message.CreationTime <= DateTime.UtcNow)
.ToList());
Run Code Online (Sandbox Code Playgroud)
当应用程序运行并通过上面的行时,这是运行的SQL查询:
SELECT [message].[Id], [message].[CreationTime], [message].[Value]
FROM [Messages] AS [message]
WHERE([message].[CreationTime] <= GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)
这基本上检索所有消息,而不是在过去24小时内创建的消息.
我想知道为什么Where()的这一部分被忽略或者没有被转换为SQL查询,以及我可以做些什么来使它工作.
(message => message.CreationTime >= DateTime.UtcNow.AddHours(-24)
Run Code Online (Sandbox Code Playgroud)
这与EF核心之前版本2.0(不支持SQL查询转换问题DateTime的方法,如AddHours,AddDays等),从而导致所谓的客户评价.您的查询应该生成正确的结果,但效率很低,因为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())
Run Code Online (Sandbox Code Playgroud)
因此要么升级到EF Core 2.0,要么通过DateTime.UtcNow.AddHours(-24)在查询外部放入变量并使用它来使用通常的EF解决方法.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |