私は、今の私が唯一、最新の10人の顧客を必要としますSqlDataReaderのを使用してデータを読み取り、収量はIEnumerableを返すメソッドを、例えば:Take(10)とSqlDataReaderのTOP 10?
IEnumerable<string> LoadCustomers()
{
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
yield return rdr.GetString(0);
}
}
}
を持っています。私はthis postによると、全体の結果セットは、DataReaderオブジェクトを読み込む場合でも、クライアントにSQL Serverから送信されている
にSELECT TOP 10 FROM Customers ORDER BY CreationDate DESC
を
LoadCustomers.Take(10)
またはSQLへのパラメータとして10を渡すのか、私のSQLを作ることができますわずか数行(接続が開いている限り) - 私はTake(10)
アプローチを回避する必要があります。その余分なデータがクライアントに送信されるか、回避するための時期尚早な最適化が行われるからです(yield return codeは、それは10行を読み取った後、データ伝送は停止します)。
「ORDER BY CreationDate DESC'? – jarlh
時期尚早の最適化ではありません。実際に必要なものだけをデータベースから取り出します。 10人だけ必要なときに10,000人の顧客を選択するのは意味がありません。 –
あなたは、その投稿が言っていることを誤解しています。読み込みを停止すると、結果セット全体がクライアントに送信されませんが、一部の行はすでにバッファされている可能性があります。 'SqlDataReader'はネットワークを越えて先読みしません。たいていの場合、 'TOP(10)'をデータベースサーバに送信したい理由とそれが早すぎる最適化ではない理由は、オプティマイザは、テーブル全体を読み込みます(他に何もない場合、クエリはあらかじめメモリを少なく割り当てます)。 –