1

重複の可能性:
WebApi を使用した OData ページネーション ( $inlinecount )

Asp.net WebAPI はほとんど odata をサポートしているため、$inlinecount を機能させて kendo ui (またはその他) とうまく連携させることは非常に魅力的です。jsonp 形式で値を返すように、新しい MediaFormatter (Stackoverflow から) を実装しました。

問題は、サーバー側のページングを機能させるために結果にカウント要素を含める必要があることです。そのため、今のところフォーマッターをハッキングして偽のカウントを機能させました。これはすべてうまく機能し、グリッドはすべて満足していますが、返される IQueryable 式には既にフィルター/テイクなどが適用されているため、実際のカウントを取得することは困難です。

 public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
    {
        string callback;
        if (IsJsonpCountableRequest(out callback))
        {
            return Task.Factory.StartNew(() =>
            {
                var q = value as IQueryable<Movie>;
                var count = q.Count(); // this count doesnt return the actual count
                var writer = new StreamWriter(stream);
                writer.Write(callback + "({");
                writer.Write(@"""d""");
                writer.Write(" : { ");
                writer.Write(@"""results""");
                writer.Write(" : ");
                writer.Flush();
                base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext).Wait();
                writer.Write(",");
                writer.Write(@"""__count""");
                writer.Write(" : ");

                writer.Write(string.Format(@"""{0}""", count));
                writer.Write("}");

                writer.Write("})");
                writer.Flush();
            });
        }
        else
        {
            return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext);
        }
    }

カウントを個別に取得する方法はありますか? IQueryable の基になるプロバイダーからのものである可能性がありますか?

4

3 に答える 3

2

私は先週正確な問題を抱えていました。有用なメタデータを使用して ASP.NET Web API 応答を拡張するを確認してください

この投稿とサンプル コードを使用して、OData を使用してページング グリッドを起動および実行しました。サンプルで詳しく説明されているように、HttpResponseMessage をキャプチャし、アイテム数を含むカスタム メタデータにラップする委任ハンドラーを作成しました。デフォルトの QueryableAttribute を継承するカスタム属性 CustomQueryableAttribute も作成されます。

ここでは少し複雑に聞こえるかもしれませんが、実際に実装するのは非常に簡単です。30分くらいで何とか出来上がりました。

Web API の将来のバージョンでは、より完全な OData サポートが提供されることを願っています。

編集: Odata サポートは、Web API には同梱されません。RTM リリースでは、照会可能な属性が削除されています。より完全な OData サポートは、別の Nuget パッケージを介して最初のリリース後に利用できるようになります。

于 2012-07-03T21:17:29.937 に答える
1

このアプローチを試してください: http://www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-package/

最新の Web API OData パッケージを使用します。

于 2012-08-23T12:38:21.847 に答える
0

この機能を実装するために使用されるSPA DataController( から派生)。ApiControllerただし、最新の変更により、別の方法で OData をサポートする予定であるため、削除されました。

MVC 4 ベータ版を使用している場合は、コントローラーを に変更するだけでDataController準備完了です。RC を使用している場合は、Codeplex での古い ASP.NET Webstackコミットを確認する必要があります。興味のあるメソッドはExecuteAsyncDataController.csから

于 2012-07-03T08:28:24.647 に答える