Web API OData Inlinecount无法正常工作

我在ASP.NET Web API应用程序中使用开箱即用的ValuesController

public class ValuesController : ApiController { // GET api/values [Queryable(PageSize = 1)] public IQueryable Get() { return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable(); } } 

当我get http://localhost/api/values?$inlinecount=allpages

这是回应

  value1  

我没有注释config.EnableQuerySupport();

过滤,排序工作正常。

如果我尝试get http://localhost/api/values?$inlinecount=XXXXX我得到一个exception,所以似乎Web API应用程序知道inlinecount

 The query specified in the URI is not valid. 'xxx' is not a valid value for $inlinecount. Microsoft.Data.OData.ODataException 

我肯定有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格式。 为此,您需要按照此博客文章中的说明操作:

http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx

您也可以选择返回PageResult 。 这看起来像这样:

 public PageResult Get(ODataQueryOptions queryOptions) { IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable()); return new PageResult(results as IEnumerable, Request.GetNextPageLink(), Request.GetInlineCount()); } 

通过添加XML和JSON的包装器对象(包括Count和下一页链接),这应该适用于OData,JSON和XML。

在OData v4中,$ inlinecount = allpages已被$ count = true取代。

$ count只适用于在最新版本的aspnet mvc中返回IQueryable。