2013-03-18 57 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