2009-08-21 18 views
1

一般に、1つのレコードが返されていると仮定すると、他のモデルよりも高速ですか?FirstOrDefault()|| Select()は速いですか?

もう一方を使用する利点はありますか?

ただ例として:

DataContext.TableBlah.FirstOrDefault(_blah => _blah.id == 1); 

又は

var test = (from blah in TableBlah 
      where blah.id == 1 
      select blah) 
+3

何も想定しないでください。 –

+0

@Ed良い点は、1つを他のものよりも使用することにいくつかの利点があるかどうかを主に探していただけです。たとえば、FirstOrDefaultが実際にフードなどで選択を使用した場合... –

答えて

1

私は

var test = dc.TableBlah.FirstOrDefault(_blah => _blah.id == 1); 

var test = (from blah in dc.TableBlah 
      where blah.id == 1 
      select blah).FirstOrDefault(); 

とまったく同じ式ツリーを設定することを90%確信しているので、あなたの第二の例は、単にFirstOrDefault()を呼び出すことにより、単一のレコードを取得する利点を欠いています。パフォーマンスの面では、それらは同じになるでしょう。

個人的には、単一のアイテムを探しているので、代わりにSingleOrDefault()を使用します。 SingleOrDefault()は、複数のレコードを受け取った場合にスローされます。

2
var test = (from blah in TableBlah 
      where blah.id == 1 
      select blah) 

これは(FirstOrDefaultに対してように)レコードを一致させるため、1つの以上の行を返すことができます。

パフォーマンスは賢明ですが、私はそれが異なるはずがないと思います。
また、テーブルの行数によって異なりますか? Id列は索引付けされていますか?

+0

はいId列がインデックスされています... –

+0

@Mike:差異はSELECT * FROMテーブルWHERE ID = 1とSELECT TOP 1の実行と同じにする必要があります* FROM TABLE WHERE ID = 1。IDと一致するレコードが1つだけの場合、列の索引付けが行われるため、パフォーマンスは問題にならないはずです。 – shahkalpesh

2

FirstOrDefaultは結果が見つかるとすぐに戻りますので、少し速くなりますが、桁違いになることはありません...とにかく、2番目のクエリは複数の結果を返すことができるため、 。代わりにSingleOrDefaultと比較することができます。これはSelectと似ていますが、結果は1つのみです。

Selectと同様に、SingleOrDefaultは完全なリストを通過する必要がありますが、1つの結果しか得られないことが保証されます。

注:あなたは、LINQ to SQLはを使用している場合は、2番目のクエリがより速くなることができますよりは、あなたのインデックスに依存...

1

これは潜在的に高速化することができます。

var test = (from blah in TableBlah 
     where blah.id == 1 
     select blah) 

使用しているLINQプロバイダによって異なります。 LINQ to SqlやSubsonicなどを使用している場合は、直接SQL呼び出しに変換され、DBから1行しか取得されません。

LINQ to Objectsでは、結果のLINQストリーミングにより2つのステートメントがほぼ同じになります。

+0

@Reed:DBから1行しかフェッチしないと言ったときに、テーブルにID = 1の行が1つしかないと仮定していると思います。そうですか? – shahkalpesh

+0

はい。それは、その前提と同じです。 LINQ to SqlとMS SQLサーバーもSELECT TOPで他のオプションを最適化するのでほぼ同じですが、亜音速の他のLINQプロバイダーはそうではないと考えていますので、すべての行を選択してストリームします1つを見つける。私が言ったように、それは〜潜在的な改善ですが、多くはあなたの環境に依存します。 –

関連する問題