2016-01-08 2 views
5

EFクエリのDateTime関数は、クエリ式の外部のDateTime関数がILを実行しているマシンによって評価されるSQL Serverによって評価されますか?Datetime.Utc C#ILのDateTime.UtcNowと異なる評価を受けました

私はSalesOrdersの

public class SalesOrder 
{ 
    public Int32 OrderID {get;set;} 
    public DateTime Expiration {get;set;} 
} 

私はEFのクエリを実行し、私はこれを行う際に異なる結果を得ているアプリケーションがあります。

var open = (from a in context.SalesOrders 
      where a.Expiration > DateTime.UtcNow 
      select a).ToList(); 
:私はこれを行う場合よりも

DateTime utcnow = DateTime.UtcNow; 

var open = (from a in context.SalesOrders 
      where a.Expiration > utcnow 
      select a).ToList(); 

これは、Entity FrameworkクエリのDateTime.UtcNowがSQL Serverによって評価されるためですクエリの外にあるDateTime.UtcNowは、ILを実行しているマシンによって評価されます。 I'm basing that off this answer

私はAzureプラットフォームのサービスとして、Azure SQL DBを使用してローカルでデバッグすることが重要です。

+0

あなたが別の時間にそれらを実行し、 'DateTime.UtcNow'が – dotctor

+0

@dotctorが異なるかもしれないので、「異なる時間でそれらを実行する」:ここでは完全なリストはありますか?私は一方向に書かれた質問を持っており、数秒間に失効したものが見えます。私はコードを変更し、期限切れのことが行われます。 – radpin

+0

今のうちの1台と5秒後のもう1台! – dotctor

答えて

5

あなたの考えは正しいです。 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' 

それは、クライアントの時刻がパラメータとして渡されていること、ここでは明らかです。

あなたの2番目のクエリは、SQLサーバーに送信する:

SELECT 
    [Extent1].[OrderID] AS [OrderID], 
    [Extent1].[Expiration] AS [Expiration] 
    FROM [dbo].[SalesOrders] AS [Extent1] 
    WHERE [Extent1].[Expiration] > (SysUtcDateTime()) 

ここでは、SQL Serverのクロックが使用されていることは明らかです。

+0

参考になっていますか? – dotctor

+1

@dotctor彼は質問出力を掲示し、私が見ているものとそれを示す他の答えとを尋ねる。あなたがしたことは、悪いアドバイスをして、質問を閉じることです。 – radpin

+1

@doctor、これはSQLプロファイラから得られる出力です。 [Giorgiの答え](http://stackoverflow.com/a/34685436/2290059)を参照してください。参照が含まれています。 –

-1

日付を比較するクエリを作成すると、EFによってDatetimeパラメータが作成され、SQL Serverに送信され、比較がサーバーによって行われます。

+0

私はそれを信じたいと思いますが、日付がまったく同じであれば、なぜ異なるコードで異なる結果が得られるのでしょうか? – radpin

+0

Datetime.UtcNowは、特に'SysUtcDateTime() 'へのSQL呼び出しとしてレンダリングされます。したがって、2番目のケースでは、SQL Serverの時刻を使用しています。 次のテストを簡単にするヒントは、MiniProfilerまたはEntity Frameworkが実行しているクエリを検査できるその他のツールをインストールすることです。 –

関連する問題