实体框架查询中的Datetime.UtcNow评估与C#IL中的DateTime.UtcNow不同

Eri*_*ric 5 c# linq datetime entity-framework azure

DateTime是否在SQL Server评估的EF查询中运行,因为运行IL的机器会评估查询表达式之外的DateTime函数?

我有一个具有SalesOrders的应用程序

public class SalesOrder
{
   public Int32 OrderID {get;set;}
   public DateTime Expiration {get;set;} 
}
Run Code Online (Sandbox Code Playgroud)

我运行EF查询并在执行此操作时获得不同的结果:

DateTime utcnow = DateTime.UtcNow;

var open = (from a in context.SalesOrders
            where a.Expiration > utcnow
            select a).ToList();
Run Code Online (Sandbox Code Playgroud)

比我这样做:

var open = (from a in context.SalesOrders
            where a.Expiration > DateTime.UtcNow
            select a).ToList();
Run Code Online (Sandbox Code Playgroud)

我认为这是因为实体框架查询中的DateTime.UtcNow由SQL Server评估,而DateTime.UtcNow在查询之外由运行IL的机器评估; 我基于这个答案.

我在Azure平台中作为服务,如果重要的话,使用Azure SQL DB在本地进行调试.

Yac*_*sad 6

你的想法是正确的.

在SQL Server上,您的第一个查询运行以下SQL查询:

exec sp_executesql N'SELECT 
    [Extent1].[OrderID] AS [OrderID], 
    [Extent1].[Expiration] AS [Expiration]
    FROM [dbo].[SalesOrders] AS [Extent1]
    WHERE [Extent1].[Expiration] > @p__linq__0',N'@p__linq__0 datetime2(7)',@p__linq__0='2016-01-08 20:05:25.4433282'
Run Code Online (Sandbox Code Playgroud)

这里很清楚客户端的时间是作为参数传递的.

您的第二个查询将其发送到SQL服务器:

SELECT 
    [Extent1].[OrderID] AS [OrderID], 
    [Extent1].[Expiration] AS [Expiration]
    FROM [dbo].[SalesOrders] AS [Extent1]
    WHERE [Extent1].[Expiration] > (SysUtcDateTime())
Run Code Online (Sandbox Code Playgroud)

很明显,使用了SQL Server时钟.


归档时间:

查看次数:

768 次

最近记录:

10 年,8 月 前