2011-08-01 10 views
4

たとえば、先月のすべてのレコードを抽出する必要があるデータソース(おそらくデータベース)があります。私はLINQを使用しています。LINQでのDateTime比較のパフォーマンス

まず:

var res = from rec in _records 
      where rec.RequestDateTime.Date.Year == date.Year && 
       rec.RequestDateTime.Date.Month == date.Month 
      select rec; 

セカンド(使用して直接日付比較):

var year = date.Year; 
var month = date.Month; 

var monthStart = new DateTime(year, month, 1); 
var monthEnd = new DateTime(year, month, DateTime.DaysInMonth(year, month)); 

var res = from rec in _records 
      where rec.RequestDateTime.Date >= monthStart && 
       rec.RequestDateTime.Date <= monthEnd 
      select rec; 

は、私は2番目のコードが速く、ほとんどのLINQのために働くことを聞いて、これを達成するためにどのように2つの方法があります。証明書や説明文(または反駁文)を見つけることはできません。だから、より良いパフォーマンスのために実際にどのように使用するのが良いの?

+0

あなたのプロファイリングは何を伝えましたか? –

+0

@Rune FS、悲しいことにプロファイリングは理由を説明していません... –

+0

あなたの質問の最初の部分にのみ答えます。 –

答えて

11

さらに詳しい情報は、ほとんどすべてのプロバイダー(特にLINQ-to-Objects)で動作します。 については、のデータインデックスがソートされているので、範囲に基づいて選択するのは本当にすばやく簡単です。 >=<=で必要な解釈はなく、要求される範囲非常ににすぐにジャンプすることができます。しかし、あなたは年と月を比較する場合、それは二つの選択肢があります:(日付を支える数値に基づいて)

  • 計算年/月と平等のための比較 - そしてそれはよく、または場合があります
(より複雑なクエリの解析を行う)こと が範囲であることを決定するためにいくつかの非常に巧妙な思考を行う代わりに、 フルスキャン
  • を必要とする、インデックスを使用することはできません3210

    最も簡単なケース(LINQからオブジェクトへ)については、同じことが成り立ちます。 >=などは簡単です - それは数値です。テスト月/年は計算月/年が必要です。そのデータは、整数として明示的に格納されず、直接手元にはありません。はい、が余計にと計算されていませんが、日付を考慮してen-masseの場合も無料ではありません。

  • 関連する問題