2

我在寻找这个问题的答案时遇到问题,我在这里只找到了另一个问题PagedList with Entity Framework 获取所有记录,但它从未收到回复,我已经浏览了这里https://stackoverflow.com/search? q=分页列表

所以我的问题是一样的,pagedlist 是否返回所有记录,然后跳过并将所需的数字作为默认值,例如,如果数据库有 1000 条记录,它将返回所有记录,然后以第 1 页的第 10 条等为例。

从我自己的调试来看,确实是这样,但我正在寻找一些澄清。

谢谢

乔治

-----------------额外代码-----------------

嗨,马丁

以下是我设置分页的方式:

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

老问题,但我还是想回答。

分页列表将查询您在pageSize参数中指定的行数。问题是您没有为_imf.RepliesToForumPost(postId).

我猜你里面的代码RepliesToForumPost正在获取该帖子的所有回复,然后PagedList在它已经从数据库中获取所有数据之后进行分页,这不是你想要的。

为了澄清起见,我将提供两种可能的实现作为示例。

第一个将延迟执行查询(它将访问数据库并获取分页列表之前的所有记录):

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

现在,第二个只是将IQueryable<>用作一个query分页列表,它将执行查询到您想要的记录数。

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

另外,您应该注意PagedList将始终执行两种方法:

  • 一次调用Count()IEnumerable以识别总记录(无论您IEnumerable是对象的物化列表还是只是IQueryable表达式表示)
  • 另一个获得所需记录的记录(同样,是否来自物化列表)

这意味着,例如,如果您正在使用Entity Framework并使用非物化IEnumerable(或者,作为我的第二个实现),对 的IQueryablePaged List 调用将执行查询以检索总行数,这可能是 1000 (这是一个简单的数据库,它根本不会获得 1000 条记录),以及第二次调用以检索您希望的实际记录/对象(例如,10 条记录)。Count()IEnumerableEntity FrameworkcountpageSize

如果我有一个包含 1000 个对象的具体化列表,因为我的代码ToList()作为我的第一个示例调用,PagedList 仍然会识别IEnumerable(一个列表)有 1000 个项目,并且会对你的 10 条记录进行分页,而不对数据库执行任何查询(因为你的列表将是已经物化了)。不过,无论如何,您的方法还是从数据库返回了 1000 行,这比执行两个查询更糟糕(一个获取 10 条记录,一个识别查询的计数将返回 1000)。

于 2017-01-25T00:02:15.570 回答
0

不,如果查询正确,EF 不会检索所有记录。由于您没有显示 ToPagedList 方法的具体实现,我们无法判断。

检查我对您提到的问题的回答。

于 2013-11-05T08:33:18.417 回答