2009-07-08 13 views
4

コード:私は結果を列挙するためにToListメソッド()を使用していますので、クエリの残りの部分が翻訳されていないLINQのツーSQLLINQを使用して列挙する正しい方法は何ですか?

var result = db.rows.Take(30).ToList().Select(a => AMethod(a)); 

db.rows.Take(30)がありますSQLへ

これを実行する最速の方法はどれですか? ToArray()?

+0

私が出会った興味深い事実は、あなたの投影でグループ結合を通して定義されたグループを使用することによって引き起こされる相関クエリが、Linq to SQLにそのグループのカウントを取得する別のサブクエリを追加させることです。私は、これらの場合、アイテムが取り出される前にコレクションのサイズがわかっていることを意味し、結果を具体化しながら処理およびメモリリソースを節約する正確なサイズの配列を直接作成できると仮定しています。 – jpierson

答えて

13

使用Enumerable.AsEnumerable

var result = db.rows 
       .Take(30) 
       .AsEnumerable() 
       .Select(a => AMethod(a)); 
+3

リンクをクリックしない場合、AsEnumerableはIEnumerable と入力された引数を返します。これにより、遅延実行が保持され、ToList()またはToArray()によって作成された中間データ構造が不要になります。 – dahlbyk

+1

だから明らかにする。 AsEnumerable()は列挙しません –

2

使用Enumerable.AsEnumerable()クエリをObjectにLINQを列挙開始するまでAsEnumerable()はまだデータベースクエリの実行をdefferますので、あなたはのでimmidiatlyデータベースクエリを実行したくない場合。

データが必要な場合、またはデータベースクエリを一時的に実行する場合は、Enumerable.ToList()またはEnumerable.ToArray()を使用します。パフォーマンスの差は大きくないはずです。

行の数がまだ分かっていないため、最初は両方の呼び出しで行が可変サイズのコンテナに読み込まれると仮定します。したがって、ToArray()はおそらく最初に一種のリストに行を読み込んでから、すべての行が転送された後に配列にコピーするのに対し、行はリストに直接読み込むことができるので、ToList()は少し速くなると言います。

関連する問題