WebApi OData:$filter 'any' 或 'all' 查询不起作用

Posted

技术标签:

【中文标题】WebApi OData:$filter \'any\' 或 \'all\' 查询不起作用【英文标题】:WebApi OData: $filter 'any' or 'all' query not workingWebApi OData:$filter 'any' 或 'all' 查询不起作用 【发布时间】:2013-03-06 17:12:12 【问题描述】:

首先,使用 ASP.NET WebApi 教程,我创建了一个基本的ApiController that exposes an Entity Framework model through OData。该服务用于为 OData $filter 查询返回 json。

当我对多值属性执行 OData $filter queries that include "any" or "all" 查询时,它会引发 ODataException

这是我尝试使用的 OData 查询

~/api/Blogs?$filter=any(Tags,Name+eq+'csharp')

我的 ApiController 如下所示:

public class BlogController : ApiController

    public BlogsController()
    
        this.Entities = new BlogEntities();
    

    public ContactEntities Entities  get; set; 

    [Queryable(PageSize = 25, AllowedQueryOptions = AllowedQueryOptions.All)]
    public IQueryable<Blog> Get()
    
        return this.Entities.Blogs;
    

博客实体有这个合同

public Blog 
    public Guid ID  get; set; 
    public string Title  get; set; 
    public Tag Tags  get; set; 


public Tag 
    public Guid ID  get; set; 
    public string Name  get; set; 

抛出的异常

ODataException: Type 'Blog' does not have a property 'Name'

如您所见,我的代码中没有任何异常,一切正常。 Microsoft ASP.NET Web API OData 中是否可能还不支持“任何”和“所有”查询?

【问题讨论】:

另一件值得注意的是,'$inlinecount' odata 选项被忽略了。 【参考方案1】:

您的任何内容都需要稍作更改。试试这样的:

~/api/Blogs?$filter=Tags/any(tag: tag/Name eq 'csharp')

这是假设标签实际上返回标签的集合,而不仅仅是像上面那样的单个标签。

$inlinecount 仅支持 OData 格式的开箱即用。我在这里写了很多关于它的文章:

Web API OData Inlinecount not working

简短的回答是,您可以使用如下代码使其适用于其他格式:

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());

【讨论】:

谢谢,伙计!在测试了您的建议后,我查看了 OData 规范……好吧,我应该先阅读一下。 $inlinecount 答案不适用于继承“ApiController”的服务 我刚刚再次测试了它——它有效。请包含您的代码和您使用的 URL。 但是 ApiController 有一个 Request 属性。您必须为 System.Net.Http 命名空间添加 using 才能获取其他方法。

以上是关于WebApi OData:$filter 'any' 或 'all' 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

OData - 在 $expand 中的集合上嵌套 $filter

ASP .NET MVC 4 WebApi:手动处理 OData 查询

WebAPI Odata 在无类型实体上应用查询选项

武装你的WEBAPI-OData聚合查询

武装你的WEBAPI-OData便捷查询

武装你的WEBAPI-OData便捷查询