2009-08-18 24 views
20

Linqを使用して最初の100レコードを返すにはどうすればよいですか?Linqを使用して最初の100レコードを選択する

私は4000万レコードのテーブルを持っています。

このコードは動作しますが、フィルタの前にすべての値を返しますので、それは、遅いです:

var values = (from e in dataContext.table_sample 
       where e.x == 1 
       select e) 
      .Take(100); 

を濾過返すために方法はありますか? T-SQL TOP句のように?

+0

私は、dataContext.table_sample.Where(e => e.x == 1).Take(100)はmantainを読み込む方が簡単だと思います。そして、SampleTableはtable_sampleよりもよさそうです。 –

+0

DataClassesDataContextデザイナ(.dbml)では、取得する列を指定することもできます。デフォルトでは、すべての列が取得されます(SQLではSELECT *)。フィールドをクリックしてプロパティを表示するだけで、フィールドを変更できます。 –

答えて

25

いいえ、フィルタリングする前にすべての値を返しません。 Take(100)は、送信されたSQLの一部になります。これはおそらくTOPを使用しています。

もちろん、orderby句を指定したときに行う方が理にかなっています。

LINQは、クエリ式の最後に達したときにクエリを実行しません。集計演算子(例:CountまたはAny)を呼び出すか、結果を反復処理するときにのみ、SQLを送信します。 Takeと呼んでも、実際にはクエリが実行されません。たとえば、クエリの一部になる可能性があります。

結果を反復処理するとき(通常はforeach) - は、SQLが実際にデータベースに送信されるときにはになります。

(私はあなたのwhere句が道で、少し壊れていると思います。あなたはそれが可能な限り現実に近いコードを見るために役立つだろうあなたの実際のコードで問題を持っていれば。)

+0

Tks、コードが修正されました。 – Zanoni

+1

それほどではありませんでした - 私はあなたが "どこにe.x == 1"を意味すると思います –

+0

あなたは正しいと思います。 – Zanoni

2

Iあなたがトップ100を取る前にすべてのレコードを返すことについてあなたが正しいとは思わないでください。私はLinqがクエリが実行される時に(Lazy Loadingと呼ばれる)SQL文字列を決定し、データベースサーバはそれを最適化しますでる。

2

標準SQLクエリとlinqクエリを比較しましたか?どちらが速く、その違いはどれほど重要ですか?

私はあなたのLINQクエリは、一般的に正確である上記のコメントに同意するが、ない...代わりに、割り当てのあなたの「」句は、おそらくあるべきX == 1ではないのx = 1(比較して

  • 'select e'は、おそらくいくつかしか必要としないすべての列を返します。select句ではより正確です(必須の列のみを入力してください)。 40milionsレコードのデータベースは非常に巨大であり、
  • は、データベースがうまくインデックス付きであることを確認してください
  • 資源のvasteは「選択*」ととにかくインデックス付きデータ

の使用をしよう - あなたはすべてのデータのすべての必要がありますか時間?おそらく何らかのパーティショニングによって、最も一般的に使用されるレコードに分割される可能性があります。

1

私は手足の外に出て、あなたのwhere句で使用されている列にインデックスがないと推測します。その場合、クエリーが実現されたときにテーブルスキャンを実行していることは間違いないので、それは時間がかかります。

2

私はジョンスキートに同意するが、ちょうど追加したい:

  1. テイクを(実装するために生成されたSQL ますユースTOP)。

  2. SQLプロファイラを実行してコードをデバッグモードで実行することができれば、生成されるSQLと実行されるタイミングを正確に確認することができます。あなたがこれを行う時間を見つけたら、あなたは何が起こるかについて多くを学ぶでしょう。

  3. ます。たとえば、SQLを生成し表示したTextWriterを割り当てることができますDataContext.Logプロパティもあり

    dbContext.Log = Console.Out;

  4. もう1つの選択肢は、LINQPadで実験することです。 LINQPadを使用すると、データソースに接続して、さまざまなLINQ式を簡単に試すことができます。結果パネルでは、SQLがLINQ式を生成したことを確認するために切り替えることができます。

関連する問題