LINQのSkip、Takeを使ってページング処理を簡潔にしてみた

こんにちは、Noyです。

趣味アプリ(ASP.NET MVC)でページングを自力で作っています。その過程でLINQのSkipとTakeという2つのメソッドを初めて使ってみたので書き残します。

Skipメソッド、Takeメソッドとは

Skip

配列などのシーケンス内の指定された数の要素を飛ばして、残りの要素を返します。

リファレンス

Take

配列などのシーケンスの先頭から、指定された数の連続する要素を返します。

リファレンス

つまり、これら2つのメソッドを使うことで「○個スキップしたところから、△個の要素を取得する」といった処理を簡潔に書くことできます。

ページング処理で書いてみた

ページング処理を書いてみます。

今回は、1ページあたり30個のアイテムを表示するサイトの場合で、2ページ目の30個を取得したいと思います。つまり、31個目~60個目までのアイテムを取得します。

準備コードは以下です。

SampleEntities db = new SampleEntities();

int pageIndex = 2; //ページ番号
int countPerPage = 30; //1ページあたりの表示数

var query = db.Table1.OrderByDescending(t => t.create_date).Select(t => t);

Skip、Takeを使わない場合

var itemListPerPage = query.ToList().Select((t, count) => new { Table1 = t, RowCount = count })
                      .Where(tt => tt.RowCount >= pageIndex * countPerPage && tt.RowCount < pageIndex * countPerPage + countPerPage)
                      .ToList();

Skip、Takeを使った場合

var itemListPerPage = query.Skip(pageIndex * countPerPage).Take(countPerPage).ToList();

すごい簡潔になってわかりやすくなりましたね。(前のコードが酷すぎるのはまた別問題…)

LINQには色んなメソッドが用意されているので使いこなせるようになりたいです。

コメント

タイトルとURLをコピーしました