2013-03-18 9 views
9

Po pierwsze, korzystając z samouczków ASP.NET WebApi, utworzyłem podstawowy ApiController that exposes an Entity Framework model through OData. Usługa działa, aby zwrócić json dla zapytań filtru OData $.

Kiedy wykonać OData $filter queries that include "any" or "all" queryies na nieruchomości multi-wartości zgłasza ODataException

Oto zapytanie OData Próbuję użyć

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

Moje ApiController wygląda następująco:

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; 
    } 
} 

Podmiot Blog ma tę umowę

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; } 
} 

Wyjątek rzucony

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

Jak widać, nie mam nic niezwykłego w moim kodu i wszystko powinno działać prawidłowo. Czy jest możliwe, że zapytania "any" i "all" nie są jeszcze obsługiwane w Microsoft ASP.NET Web API OData?

+0

Kolejną rzeczą wartą odnotowania jest, że " $ inlinecount 'opcje odata zostaną zignorowane. –

Odpowiedz

15

Twoje potrzeby mogą zostać nieco zmienione. Wypróbuj coś takiego:

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

Zakłada, że ​​tagi faktycznie zwracają kolekcję znaczników, a nie tylko pojedynczy znacznik taki jak powyżej.

$ inlinecount jest obsługiwany tylko po wyjęciu z pudełka dla formatu OData. I pisał o tym tutaj:

Web API OData Inlinecount not working

Krótka odpowiedź jest taka, że ​​można je dostać pracę dla innych formatów z kodem, który wygląda tak:

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

Dzięki, stary !! Po przetestowaniu Twojej sugestii przyjrzałem się specyfikacji OData ... powiedzmy, że powinienem ją najpierw przeczytać. –

+0

Odpowiedź $ inlinecount nie działa dla usługi dziedziczącej "ApiController" –

+0

Po prostu przetestowałem ją ponownie - działa. Podaj swój kod i użyty adres URL. –