15

首先,使用 ASP.NET WebApi 教程,我创建了一个基本的ApiController,它通过 OData 公开一个实体框架模型。该服务用于为 OData $filter 查询返回 json。

当我在多值属性上执行包含“任何”或“所有”查询的OData $filter 查询时,它会引发 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是否可能不支持“任何”和“所有”查询?

4

1 回答 1

26

你的任何需要改变一下。尝试这样的事情:

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

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

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

Web API OData Inlinecount 不起作用

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

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());
}
于 2013-03-18T12:32:17.860 回答