2016-11-02 8 views
1

誰かが私を助けることができると思います。私はカスタムのページングをODataフィード(oData v4)に実装しようとしています。私が午前問題は、以下のコードは、ページングから離れて完璧に動作することであるしかし、私は(ワーキングパーフェクト)は、私は以下のことでページングする手段を追加したために、ストアドプロシージャからOData(v4)Web APIにカスタムページングを追加するC#

SELECT * 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNum, * 
    FROM  dbo.Order 
    WHERE  CompanyID = @CompanyID 
) AS RowConstrainedResult 
WHERE RowNum >= @Start AND RowNum <= @Finish 
ORDER BY RowNum 

をIEnumerableをを満たしていません

基本的には、結果を100のバッチでページングしようとしていますが、必要に応じてデータベースから100を取っています。

私は最初にコントローラを呼び出すと、期待した結果が得られます。

http://localhost:24600/Data/Orders 

しかし、私は(下)このnextLinkを照会するとき、私は50,000以上のデータベースにおける結果とIEnumerableを結果が正しく更新されているがあり事実にもかかわらず、エラーが、何もありません何を取得していません。

http://localhost:24600/Data/Orders?$skip=100 

私がodataを初めて使用しているときに私がこれを手伝ってくれたら大変感謝しています。

更新

それは、それは最初のバッチのサイズをカウントし、合計サイズとして、私は合計サイズを設定していていてもすることを取っている、ように見えます。初期のサイズを上回ることはできないようです。あなただけ(IQueryableなど)の完全なセットを返し、ODataのは、ページングを処理させることができ

+0

docsから:大規模なエンティティセットの場合、クライアントは結果の数を制限したいかもしれません。たとえば、クライアントは一度に10個のエントリを表示し、次のページを取得するために「次の」リンクを表示することがあります。これを行うために、クライアントは$ topと$ skipオプションを使用します。 http:// localhost/Products?$ top = 10&$ skip = 20 – Daniel

+0

実際に($ top = 10&$ skip = 20のような)データをクエリしようとすると、シーンが起こっているにもかかわらず、IEnumerable結果が表示されません。私は応答の中に次のバッチを置いている例のために、私は戻り値にブレークポイントを置くことによってデバッグするときに結果を見ることができますが、それを表示することを拒否しています。奇妙なことは間違いがないということです。 –

答えて

1

[EnableQuery(PageSize = 100)] 
public IQueryable<Order> Get() 
{ 
    return _OrderRepo.GetAll(CompanyID); //Assuming this returns an IQueryable 
} 

のODataはIQueryableを処理する方法を知っていて、エントリを取得するために.Top().Skip()を使用しますが、これはに変換されますクエリー可能なプロバイダーによるSQL。 (おそらくEF?)

+0

問題は、データセットが非常に大きく、一度にすべて取得することです。それは50kを超えるレコードです。それは、もし私が箱のものを使うなら、それは本当に遅いことを意味します。 –

+0

Entity Frameworkを使用している場合(そのオプションですか?)、IQueryableインターフェイスを使用して一度にすべてを取得する必要はありません。 'DbContext.Set ().Where(o => o.CompanyID == cId)'は、すべてのデータではなく、IQueraybleを返します。これをODataに渡すと、必要なレコードのみが照会されます。 これは、データベースから必要なデータのみが取得されたことを意味します。 – GWigWam

+0

エンティティ・フレームワーク。複雑な型に対処する必要があるわけではありません。たとえば、ジョインや日付やものへの文字列のキャストなどです。私は自分の質問を単純なままにしようとしていた –

関連する問題