2011-08-03 9 views
1

私はページングを行う必要があるASP.NET 2.0のWebアプリケーションを手に入れました。私のデータアクセスの方法はDataSetをデータベース呼び出しから取り出し、List<Foo>(Fooは私がDBから引き出している私のタイプです)に変換し、GridViewをバインドします。これは私のアプリケーションでDataTableの文字列インデクサーを使用する必要がなく、クラスのプロパティとして表示ロジックを実装することでデータベースから表示ロジックを分離できるということです。これは、SQLの代わりに.NETで並べ替えを実行していることを意味します。ソート中のASP.NET 2.0で効率的なカスタムページング

、その後、私は、データベースからすべてのFooを引っ張るリストをソートし、ディスプレイにフルリストの中から、私が欲しいものを取る必要があり、ページングを実装するには、次の

List<Foo> myFoo = MyDB.GetFoos(); 
myFoo.Sort(new Foo.FooComparer()); 
List<Foo> toDisplay = new List<Foo>(); 
for (int i = pageIndex * pageSize; i < (pageIndex + 1) * pageSize && i < myFoo.Count; i++) 
{ 
    toDisplay.Add(myFoo[i]); 
} 
//bind grid 

十分な要素では、この遅れの原因となる。テスト用データベースに接続している私の開発マシンでは、DBから5000レコードを引くときに画面上の1つのグリッドをバインドするのに約0.5秒かかります。

この問題を解決するには、すべての表示ロジックをSQLに移動してソートとページングが行えるようにするか、より良い方法がありますか?

また、LinqがSQLを解決しますか? .NETクラスに実装されているカスタムプロパティでソートしてから.Skip(pageIndex * pageSize).Take(pageSize)を使用すると、それはthis questionに記載されているようにSQLに変換されますか?

答えて

0

はい - レコード選択をSQL(ソートおよびページング)に移行することをお勧めします.SQLでページングを実行する従来の方法はCTEを使用することです。私はあなたに良い例を見つけ、私の答えを更新します。ここに良い例がありますhttp://softscenario.blogspot.com/2007/11/sql-2005-server-side-paging-using-cte.html - 私は "SQLページングcte"のためのグーグル。

+0

LinqからSQLへの問題解決方法はありますか? –

0

Linq to SQLは、この記事で説明したRow_Numberアプローチを使用します。一般に、データベースへのパフォーマンスページングクエリがあります。

しかし、SQLがあなたのためにページングし、まだ実行可能なデータ量には限界があります。

数百万行以上のテーブルがある場合、ページング関数は、照会されたデータの量を制限し、その後Row_Numberアプローチでページングする必要があります。

のは、ちょうどこのクエリのページにしたいとしましょう:

Select column1, column2, column3 from table1 where column1 > 100 

今度は、1,000,000行を返すとしましょう。 SQL Serverは依然として100万行以上のページングルーチンを実行する必要があります。初期クエリーの結果セットをページアウトするには数秒かかります。そして、すべてのクエリでこれを実行する必要があります。

パフォーマンスが維持されていることを確認するには、SQLが返すレコードの量を制限する必要があります。

Select TOP 10000 column1, column2, column3 from table1 where column1 > 100 

は今、100万件のレコードがクエリに一致するにもかかわらず、唯一の10000は、ページングされ、これはサブ秒の応答に物事をスピードアップします。このシナリオでは、データベースに実行されたクエリが広すぎることをユーザーに通知し、すべての可能な結果が結果ではないため、検索条件を絞り込む必要があります。

関連する問題