けさらんぱさらん

方向性は定めず、ただ思いつくままに

mongoDBでASP.NETのGridViewのソートとページングを試してみる

先日のVSUGこちらのブログで@onosさんが紹介されている
ASP.NETの新しい機能がとっても良さそうだったので
mongoDBでもやってみました。


Memberクラスを作成します

public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Mail { get; set; }
}

あっとMongoDriverをNuGetでインストールしておきましょう

install-package mongocsharpdriver

適当にデータを登録しておきます。
f:id:cer1974:20121221233410p:plain

mongoDBからデータを取得します。
IQueryableで戻り値を返します。

protected IQueryable<Member> SelectMembers()
{
    MongoDatabase db = new MongoClient( "mongodb://127.0.0.1" ).
        GetServer().GetDatabase( "aspnet_sample" );
    MongoCollection<Member> collection = 
        db.GetCollection<Member>( "members" );

    return collection.AsQueryable();
}

GridViewを配置してSelectMethodに上記で作成したSelectMembersを設定します。

<form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server"SelectMethod="SelectMembers"></asp:GridView>
    </div>
</form>

実行します。
全件表示されました。
f:id:cer1974:20121221235859p:plain

次にソートとページングの設定を加えます。
件数が少ないのでページサイズを3にしておきます。

<form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" SelectMethod="SelectMembers"
            AllowSorting="true" AllowPaging="true" PageSize="3"></asp:GridView>
    </div>
</form>

@onosさんのブログでは、ここで例外になっていましたが
こちらはうまく行ってしまいました。はて?
f:id:cer1974:20121224215842p:plain

MongoDriverのソースを見てみるとMongoQueryableはIOrderQueryableを実装しているので
例外にならないんですね~ なるほど!

public class MongoQueryable<T> : IOrderedQueryable<T>

ページングしてみます。
f:id:cer1974:20121224225208p:plain

ソートしてみます。
f:id:cer1974:20121224225400p:plain

どちらも出来てますね。すばらしい!
こんなに簡単にソートとページングが出来るなんて!

ここで疑問なのは、どこでソートとか処理してるのって話ですね
全件取得してクライアント側でやってる?
まあそれは無いよね。でも一応、見てみる。
f:id:cer1974:20121224230128p:plain
大丈夫そうですね。(当たり前ですかね

送信情報も確認してみましょう
f:id:cer1974:20121224230633p:plain
はいちゃんと呼んでますね

mongoDBのログも見てみましょう
ページング
f:id:cer1974:20121224232330p:plain
Countしてますね。これは総件数でも取ってるのかな?
SkipとかTake的なものが無い感じ?
でも何故か3件しか返してないですね。

全件取るとこんなログになる
f:id:cer1974:20121224232909p:plain

あえてSkipとTakeを入れるとこんな感じ
f:id:cer1974:20121224233939p:plain
ちゃんとSkipとLimit(LINQではTakeだけど)されてますね~
ちょっと分からないですね

ソート
f:id:cer1974:20121224234441p:plain
こちらは、想定通りにログが出てますね

ちょっとmongoDBのログの見方が分かっていないので微妙なところもありますが
ASP.NETのソートとページングは、当たり前ですがちゃんとDBから取得してるってことですかね
まあmongoDBでもちゃんと出来ましたよって話でした!