4

次のコードのようなものを使用して、データセット全体をプログラムにロードせずにデータをページ分割する方法はありますか?

var r = from c in entities.GetSearchData(null,"en",null,true) select c;
IPagedList<Models.SearchResult> results = r.ToPagedList<Models.SearchResult>(1, 10);

LINQ でストアド プロシージャを使用して、ページングされた結果を取得しようとしています。(ところで、上記のコードでは、「クエリの結果を複数回列挙することはできません。」というエラーが発生します)。出来ますか?

4

2 に答える 2

2

現時点では Entity Framework でテストできませんが、通常の LINQ-to-SQL では次のステートメントを使用できます。

var rpage1 = entities.GetSearchData(null,"en",null,true).Skip(0).Take(10)
var rpage2 = entities.GetSearchData(null,"en",null,true).Skip(10).Take(10)
var rlist = rpage1.ToList();

LINQ は次のような句を生成します

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1

私の場合、結果のクエリは次のとおりです (GetConstantsValues はストアド プロシージャです)。

SELECT [t1].[value] AS [Value]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[value]) AS [ROW_NUMBER], [t0].[value]
    FROM [dbo].[GetConstantsValues](@p0) AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER]

したがって、関連する結果のみがプログラムにロードされます。

EFはそれと大差ないはずだと思います。間違っているかもしれません。

于 2013-01-09T13:48:24.857 に答える
1

LINQ to SQL に戻る必要はありません。あなたが作ることができる微調整があります。エンティティ フレームワークでは、ストアド プロシージャの結果は のコレクションでObjectSetあるため、通常の列挙可能なコレクションに変換しない限り、列挙は複数回許可されません。

このような場合に対処する最も簡単な方法は次のとおりです。

var r = from c in entities.GetSearchData(null,"en",null,true) select c;
IPagedList<Models.SearchResult> results = 
    r.ToList().ToPagedList<Models.SearchResult>(1, 10);

ここで r.ToList() が魔法を作り、コードは問題なく動作します!!

注*: これはかなり古い投稿であることは承知していますが、助けを求めてここに来る人を助けることを考えました!

于 2013-07-26T09:55:06.293 に答える