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

をスローここに私は私のApiControllerはこのようになります

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

を使用しようとしているのODataクエリです:

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オプションは無視されます。 –

答えて

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仕様を見ました...まあ、それを最初に読んだはずだと言いましょう。 –

+0

$ inlinecountの答えは "ApiController"を継承するサービスでは機能しません –

+0

もう一度テストしました。あなたのコードと使用したURLを含めてください。 –

関連する問題