2

私はこの質問への答えを見つけるのに問題があります.ここでPagedListでEntity Frameworkがすべてのレコードを取得している他の質問は1つしか見つかりませんでしたが、返信を受け取ったことはなく、ここhttps://stackoverflow.com/search? q=ページリスト.

だから私の質問は同じです。

私自身のデバッグからは、そのように見えますが、明確化を求めています。

ありがとう

ジョージ

------------------追加コード -------------------

こんにちはマーテン

以下は、ページングの設定方法です。

var model = new DisplayMemberForumRepliesViewModel
                    {
                        DisplayMemberForumReplyDetails = _imf.RepliesToForumPost(postId).ToPagedList(page, _numberOfRecordsPerPage)

                    };

モデルを見る

public class DisplayMemberForumRepliesViewModel
{
    public IPagedList<MembersForumProperties> DisplayMemberForumReplyDetails { get; set; }
    public IEnumerable<MembersForumProperties> SelectForumPostReplies { get; set; }
}

前述のように、すべてのレコードを返し、ページングされたレコードを選択するようです。

私が間違っていることがわかりますか。以下に追加した SQL ストアド プロシージャからデータを取得しています。

SELECT        a.[MemberUsername]                        AS ForumMember,
                  a.[MemberID]                              AS ForumMemberID,
                  a.[MemberAvatarLocation]                  AS ForumMemberAvatar,
                  b.[ForumPostID]                           AS ForumPostID,
                 -- b.[ForumPostReplyID]                        AS ForumPostReplyID,
                  b.[ForumPostReplyMessage]                 AS ForumReplyMessage,
                  b.[ForumPostReplyDateTime]                AS ForumRelyDateTimePosted,
                  b.[ForumPostReplyMessage]                 AS ForumPostReply,
                  c.[ForumPostTitle]                        AS ForumPostTitle
            FROM [WebsiteMembership].[dbo].[tblMemberProfile] a 
       INNER JOIN [Website].[dbo].[tblForumMembersPostReplies] b  ON a.[MemberID]=b.[ForumPostReplyMemberID]
       INNER JOIN [Website].[dbo].[tblForumMembersPost] c  ON a.[MemberID]=c.[ForumMemberID]
       WHERE b.[ForumPostID] = @ForumPostID
      ORDER BY b.[ForumReplyTableID] DESC 

ありがとう

4

2 に答える 2

1

古い質問ですが、とにかく答えたかったのです。

Paged List は、pageSizeパラメーターで指定した行数を照会します。問題は、 のコード実装を提供していないことです_imf.RepliesToForumPost(postId)

内部のコードRepliesToForumPostは、その投稿に対するすべての返信を取得しPagedList、データベースからすべてのデータを取得した後にページネーションを行っていると思いますが、これはあなたが望むものではありません。

明確にするために、例として2つの可能な実装を提供します。

この最初のものは、クエリの遅延実行を行います (データベースにヒットし、ページ リストの前にすべてのレコードを取得します)。

public IEnumerable<MembersForumProperties> RepliesToForumPost(int postId)
{
    using (MyContext db = new MyContext())
    {
        return db.MembersForum.Where(c => c.PostId == postId).ToList();
    }
}

さて、この 2 番目のリストは、必要な数のレコードに対してクエリを実行するリストIQueryable<>として機能するように取得されます。query

public IQueryable<MembersForumProperties> RepliesToForumPost(int postId)
{
    using (MyContext db = new MyContext())
    {
        return db.MembersForum.Where(c => c.PostId == postId).AsQueryable();
    }
}

PagedListまた、常に 2 つのメソッドが実行されることに注意してください。

  • Count()あなたのを1 回呼び出してIEnumerable、合計レコードを認識します (IEnumerableオブジェクトの実体化されたリストであるか、単なるIQueryable式表現であるかに関係なく) 。
  • 目的のレコードを取得するためのもう 1 つのレコード (実体化されたリストからのものかどうかに関係なく)

これは、たとえばEntity Frameworkを使用していて、マテリアライズされていないIEnumerable(または、IQueryable私の 2 番目の実装として) を使用している場合、 の Paged List 呼び出しはクエリを実行しCount()て行の総数を取得することを意味します。 1000 (データベースでは単純で、1000 レコードを取得することはできません) の可能性があり、希望する (たとえば、10 レコード)に関して、実際のレコード/オブジェクトを取得するための 2 番目の呼び出しです。IEnumerableEntity FrameworkcountpageSize

コードが最初の例として呼び出されたために 1000 個のオブジェクトを含む実体化されたリストがあった場合ToList()、PagedList はIEnumerable(リスト) に 1000 個のアイテムがあることを認識し、データベースへのクエリを実行せずに 10 個のレコードをページ分割します (リストがすでに実現しています)。ただし、メソッドはとにかくデータベースから 1000 行を返しましたが、これは 2 つのクエリを実行するよりも悪いことです (1 つは 10 レコードを取得し、クエリを認識するカウントは 1000 を返します)。

于 2017-01-25T00:02:15.570 に答える