2

MVC4 アプリケーションで OData の使用を開始していますが、複雑なオブジェクトを使用しているため、IQueryable でソートまたはフィルター操作を実行できないという問題があります。以下は、私が達成しようとしているものの簡単な例です。

API コントローラーが MyObjects のコレクションを IQueryable として返そうとしています。

public IQueryable Get()
{
    List<MyObject> myObjects = GetMyObjects();
    return myObjects.AsQueryable() ;
}

各 MyObject には、並べ替えやフィルター処理を行うプロパティを持つ InnerObject が含まれています。

public class MyObject
{
    [Key]
    public MyInnerObject innerObject{ get; set; }

    public MyObject(Dictionary<string, object> value)
    {
        innerObject= new MyInnerObject(){
            item = value["item"].ToString(),
            itmdesc = value["itmdesc"].ToString()
        };
    }
}

public class MyInnerObject
{
    public string item { get; set; }
    public string itmdesc { get; set; }
}

URLからトップコマンドを正常に実行できます

localhost:5050/Test/Get?$top=10

しかし、私は本当に自分の結果を並べ替えたいと思っています

localhost:5050/Test/Get?$top=10&$orderby=innerObject.item

私が試してみました

localhost:5050/Test/Get?$top=10&$orderby=innerObject.item
localhost:5050/Test/Get?$top=10&$orderby=innerObject/item
localhost:5050/Test/Get?$top=10&$orderby=item

助言がありますか?

編集:

item および itmdesc プロパティを MyObject 内に配置すると機能することに注意してください。ただし、私の目的 (これは複雑なエンティティの単なる縮小版です) では、これらを複雑な型でラップする必要があります。

私のApiコントローラーでは、 IQueryable< MyObject> も試しましたが、違いはありません

4

2 に答える 2

4

一般に、プロトコルとしてのODataは、2番目に試したものを許可します(localhost:5050/Test/Get?$top=10&$orderby=innerObject/item)。これは、ODataのWeb API実装の一時的な制限である可能性があります(残りの環境とIQueryableの戻りに基づいて使用していると仮定します)。

于 2012-10-15T23:29:59.980 に答える
1

Aspnet Web API ODataは、ネストされたプロパティまたは式による順序付けをサポートしていません。ネストされたプロパティによる順序付けをサポートするために、codeplexで未解決の問題があります。

ただし、少し冒険的な場合は、ODataQueryOptionsを使用して個々のodataクエリオプションをモデルバインドし、$ orderby ASTをlinq式に変換して、手動でIQueryableに適用できます。

于 2013-01-25T18:29:06.237 に答える