2013-03-18 54 views
9

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

当我在一个多值属性进行的OData $filter queries that include "any" or "all" queryies它抛出一个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中是否有可能“any”和“all”查询不被支持?

+0

另一个值得注意的事情是,' $ inlinecount'odata选项被忽略。 – 2013-03-18 11:32:17

回答

15

您的任何需要改变一下。尝试这样的:

~/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()); 
} 
+0

谢谢,男人!在测试了你的建议之后,我看了一下OData规范......好吧,我们只是说我应该先阅读它。 – 2013-03-18 12:59:22

+0

$ inlinecount答案不适用于继承“ApiController”的服务 – 2013-03-18 14:47:58

+0

我只是再次测试它 - 它的工作原理。请包含您的代码和您使用的网址。 – 2013-03-18 16:07:49