15

まず、ASP.NET WebApi チュートリアルを使用して、OData を介して Entity Framework モデルを公開する基本的な ApiController を作成しました。このサービスは、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 に答える