ASP.NET Web APIアプリケーションでそのままのValuesControllerを使用しています
_ public class ValuesController : ApiController
{
// GET api/values
[Queryable(PageSize = 1)]
public IQueryable<string> Get()
{
return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable();
}
}
_
私が_get http://localhost/api/values?$inlinecount=allpages
_のとき
これが反応です
_<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>value1</string>
</ArrayOfString>
_
コメントがありませんconfig.EnableQuerySupport();
フィルタリング、ソートは正常に機能します。
_get http://localhost/api/values?$inlinecount=XXXXX
_を試すと例外が発生するので、Web APIアプリケーションはinlinecount
を認識しているようです
_<Message>The query specified in the URI is not valid.</Message>
<ExceptionMessage>'xxx' is not a valid value for $inlinecount.</ExceptionMessage>
<ExceptionType>Microsoft.Data.OData.ODataException</ExceptionType>
_
私は間違いなくMicrosoft.AspNet.WebApi.ODataパッケージを持っています-これはパッケージマネージャーコンソールの出力です
_PM> Install-Package Microsoft.AspNet.WebApi.OData
Attempting to resolve dependency 'Microsoft.Net.Http (= 2.0.20710.0 && < 2.1)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (= 4.0.20710.0 && < 4.1)'.
Attempting to resolve dependency 'Newtonsoft.Json (= 4.5.6)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (= 4.0.20710.0 && < 4.1)'.
Attempting to resolve dependency 'Microsoft.Data.OData (= 5.2.0 && < 5.3.0)'.
Attempting to resolve dependency 'System.Spatial (= 5.2.0)'.
Attempting to resolve dependency 'Microsoft.Data.Edm (= 5.2.0)'.
'Microsoft.AspNet.WebApi.OData 4.0.0' already installed.
WebServicesProject already has a reference to 'Microsoft.AspNet.WebApi.OData 4.0.0'.
_
助言がありますか?
すばらしい質問です。
すぐに使える$ inlinecountは、ODataレスポンスを送り返すときにのみ機能します。この理由は、ODataはXMLおよびJSONが定義しないデータ内の特別なフィールドを定義するためです。したがって、ODataでは、応答は次のようになります。
{
"odata.metadata":"http://localhost:12345/odata/$metadata#Customers",
"odata.count":"4",
"value":[ ... ]
}
「odata.count」プロパティを持つラッパーに注目してください。この追加情報のラッパーがないため、これはデフォルトのXMLおよびJSONフォーマッターがデータを書き込む方法とは異なります。したがって、他のフォーマッタはデフォルトで変更されていません。
現在、いくつかのオプションがあります。
OData形式の使用を選択できます。そのためには、このブログ投稿の指示に従う必要があります。
代わりにPageResult<T>
を返すこともできます。これは次のようになります。
public PageResult<Customer> Get(ODataQueryOptions<Customer> queryOptions)
{
IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable());
return new PageResult<Customer>(results as IEnumerable<Customer>, Request.GetNextPageLink(), Request.GetInlineCount());
}
これは、Countと次のページへのリンクを含めることができるXMLおよびJSONのラッパーオブジェクトを追加することにより、OData、JSON、およびXMLで正常に機能するはずです。
OData v4では、$ inlinecount = allpagesが$ count = trueに置き換えられました。
$ countは、最近のバージョンのaspnet mvcでIQueryableを返すだけで機能します。