2016-12-08 20 views
5

次のLINQを使用してデータベースにクエリを行い、特定の日付から削除された製品を取得します。 fromDateからはfromDateから= {2016年12月8日午前11時41分であった場合LINQでのDateTimeの比較が正しい結果を返さない

return _myDbEntities.Log 
      .Where(p => p.Action.Equals("Deleted") && 
      (p.ActionDate > fromDate)) 
      .Select(p => new DeletedProduct() 
      { 
       ProductId = p.ProductId, 
       ActionDate = p.ActionDate 
      }).ToList(); 

しかし、クエリがproduct.ActionDate.Value = {2016年12月8日11時41分00秒AM}のような値をretreivingれます。 00 AM}

クエリで明らかにGREATER THANと表示されます。ここで何が起きてるの?

+0

秒の小数点を確認します(またはタイムスタンプとして表示します)。たぶん違いはありますか –

+2

ActionDateのタイプは?試してみてください(p.ActionDate.Value> fromDate)? –

+0

クエリでは 'product.ActionDate'を使用していますが、titでは' product.ActionDate.Value'が必要です。 – Guy

答えて

3

各プロパティには1秒の割合があります。ほとんどの場合、あなたのレコードは正確な秒で作成されなかったのに対し、ユーザが作成した時間はそのように設定されていました。

もう1つの可能性はdifference between datetime and datetime2 in SQL Serverです。

0

DateTimeタイプは秒よりずっと高い精度で時間を格納します。ミリ秒またはティック(100ナノ秒)レベルでも異なる場合があります。あなたがより高いレベルで比較したい場合は

、これを試してみてください:10000000が第二でティック数がある

(p.ActionDate.Ticks/10000000) > (fromDate.Ticks/10000000) 

/は分数を切り捨てる整数除算であるため、ティックをフル秒に変えます。

UPDATE:

あなたは、エンティティフレームワークを使用しているように思えます。上記の比較はおそらくそこで動作しません。解決策は、元のクエリをデータベースに対して実行し、ToListを実行し、上記のロジックを使用してLINQ2Objectsクエリで結果を再度フィルタリングすることです。

+0

**すべてのリストを取得してメモリ内で追加のフィルタリングを行う必要はありません。プロジェクトのサイズによっては、データベースから返される余分なデータがたくさん生成され、そのデータをC#オブジェクトに解析する必要があります。あなたが持っているツール(SQL Server)を利用して、それをフィルタリングしましょう。 – krillgar

+0

@krillgar:あなたはすべてのリストを取得しません。すでに比較を行っている元のクエリ結果を取得します。 2番目のフィルタは、値が1秒未満のレベルでのみ異なる少数の結果をフィルタリングすることです。 – Sefe

+0

OK、私は誤解しました。 OPがデータベースを 'datetime2'カラムに変更する能力を持たない場合、これはうまくいくでしょう。しかし、彼らがその変更を行うことができれば、これを行う必要はありません。 – krillgar

関連する問題