我在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'.
有什么建议吗?
答案 0 :(得分:26)
很棒的问题。
开箱即用的$ 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());
}
通过添加XML和JSON的包装器对象(包括Count和下一页链接),这应该适用于OData,JSON和XML。
答案 1 :(得分:4)
在OData v4中,$ inlinecount = allpages已由$ count = true代替。
$ count只能在最新版本的aspnet mvc中返回IQueryable。