2

Web Api に OData サービスを使用して、クライアント アプリにページネーションを提供しています。これは、私のコントローラー メソッドの 1 つのコードです。

// Get all Categories
    [HttpGet]
    [ActionName("all")]
    public ODataResult<DataAccess.Model.Category> GetCategoryList(ODataQueryOptions options)
    {          

        var categoryList = this.Repository.GetCategories().AsQueryable<Category>();

        var results = (options.ApplyTo(categoryList) as IQueryable<DataAccess.Model.Category>);                     


        long count = categoryList.Count();

        if (count == 0) 
            count = 1; // throws up an ArgumentException error if the count is less than 1

        return new ODataResult<DataAccess.Model.Category>(results, null, count);

    }

しかし、api/Category/all?$skip&$top=5 のような API 呼び出しで OData プロトコルを使用すると、5 ~ 10 個の要素がデータベースに存在する正確な順序が返されません (つまり、主キーでソートされます)。 =ID)。すべての API 呼び出しに $orderby=ID を使用することでこれを修正できますが、回避できるかどうかを知りたいです。デフォルトでは、OData サービスはデータベースにあるのと同じ順序で返されるはずなので、ここで何か間違ったことをしていますか? アイデアや提案があれば教えてください。

ありがとう

4

2 に答える 2

4

デフォルトでは、キー プロパティによって結果セットを並べ替え、安定した並べ替えが行われるようにします (ページネーションが壊れていない場合)。したがって、モデルが何であるか、つまり DataAccess.Model.Category がどのように見えるかを確認することは興味深いでしょう。また、安定した並べ替えを自分で行い、webapi の推論された順序を無効にする場合は、ODataQuerySettings.EnsureStableOrdering (false) を ApplyTo の他のオーバーロードに使用できます。

public virtual IQueryable ApplyTo(IQueryable query, ODataQuerySettings querySettings);
于 2012-11-28T01:44:47.290 に答える
2

OData では、クライアントが要求しない限り、特定の順序を強制するものはありません。$top および $skip クエリ オプションは、既定で (.NET 実装では) キー プロパティ (主キー) の順序付けを使用する "何らかの安定した" 順序付けを強制しますが、単にセット内のすべてのエンティティを要求すると、サービスは順序を強制しない (必要がないため) ため、基礎となるプロバイダーが提供する順序を返します (DB などに依存します)。

于 2012-11-27T13:58:49.570 に答える