さて、怪しい妖しいサイト、おかげさまで盛況です。ありがとうございます。色んな方からの色んな要望・希望・イチャモン・わけわからん中傷などなどをいただいておりますが、食欲の秋でもあるので美味しいトコだけカジリつつ精進させていただいてます。かまってもらえるって幸せだナァ(おい)
ってことで、このサイト実現に至る&メンテナンスの過程で見つけたことなんかをちょこちょこと書いてみようかなんぞとおもってみたわけです。何かのお役にたてれば幸いですですですよ。
そして、今日の~てぇまはぁ~っ…… (By加賀丈史)
VB.NETのLINQでページング
ページングって何ぞ?という人はこちら
http://japan.internet.com/developer/20060509/26.html
http://japan.internet.com/developer/20060620/25.html
早くからここの部分は手を入れよう、と思っていたのがこれでした。情報収集&リスト一覧検索がメインのサイトである以上レコードが増え続ける事がわかっていたのですし、検索さえ機能してしまえばあまり一覧は使わなくなるだろうと思っていましたし。かといってページ開いてイキナリ検索ボックスだけだと寂しいし<おい
なので、効率よく、かつ、サイトが重くならない範囲でのリスト表示制御、を実現したい時にページングはとても有効な手段ってわけなのですです。
さて、まずは旧ソース。元記事はこっちね
Gd.DataSource = From L In pMContext.MissionList Where L.MID Join M In dMl On L.MID Equals M.MID _
Select MID = L.MID, _
DNGN = L.DNGN, _
PNAME = L.PNAME, _
RANK = L.RNK, _
EXMM = L.EXMM, _
RWD = L.RWRD, _
PWD = L.PWD
Gd.DataBind()
こちら、新ソース。
Gd.DataSource = From L In pMContext.MissionList Where L.MID Join M In dMl On L.MID Equals M.MID _
Select MID = L.MID, _
DNGN = L.DNGN, _
PNAME = L.PNAME, _
RANK = L.RNK, _
EXMM = L.EXMM, _
RWD = L.RWRD, _
PWD = L.PWD _
Skip (Gd.PageIndex * Gd.PageSize) _
Take (Gd.PageSize)
Gd.DataBind()
ステートメントが増えてます。ポイントはそこ。
SKIP →取得するレコード開始位置指定
TAKE →取得するレコード件数指定
この二つさえ押さえてしまえば、ページングの考え方を簡単簡潔即実装。LINQの超便利ステートメント、TAKEとSKIPを駆使することで、一ページ分に必要なレコードだけをピンポイントで取得、これをGridViewへバインドさせることで処理が高速できるってシカケです。次の応用としては、一ページに何行表示するかをユーザーが設定できるようにしたいのですけれど、このロジックのどの変数に対して何をすれば良いのか、もう大体の方は直感でお分かりいただけると思います。
なお、このやり方はほんの一例。プログラミングにはいくつかのセオリーがあるとはいえ、答えは一つとは限りませんので、そこんところもよろしくです<何がだオイ
こうやって見るとカンタンじゃん、なんだけど、知って触ってこういうことかと理解するまでは時間がかかったの。というわけで
参考にしたサイトはこちら
まずはどどーんとブックマーク必須的LINQサンプルコード集。素晴らしいラインナップです。
http://msdn2.microsoft.com/en-us/vbasic/bb688084.aspx
そしてLINQの勉強にあたってはScottGuさんのブログは欠かせないですね。判りやすい解説に感謝。
http://weblogs.asp.net/scottgu/
ピンポイントなLINQ、Gridviewページングに関する記事はこちらに翻訳版で。
http://blogs.wankuma.com/chicasharp/archive/2007/09/09/94926.aspx
毎度の事ながら、Chicaちゃん翻訳GJ&Thanksです。だってニホンジンだもの。