ToPagedList返回所有记录

时间:2013-11-05 08:18:51

标签: c# pagedlist

我在找到这个问题的答案时遇到了问题,我在这里只发现了另外一个问题PagedList with Entity Framework getting all records,但它从未收到过回复,我在这里查看https://stackoverflow.com/search?q=pagedlist

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

从我自己的调试中,它看起来确实如此,但我正在寻找一些澄清。

由于

乔治

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

嗨Maarten

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

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 

由于

2 个答案:

答案 0 :(得分:0)

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

Check my answer关于你提到的问题。

答案 1 :(得分:0)

老问题,但无论如何我想回答。

分页列表将查询您在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表达式)
  • 获得所需记录的另一个(同样,是否来自物化列表)

这意味着,如果您正在使用实体框架并使用非实体化的IEnumerable(或IQueryable作为我的第二个实施方案),对Count()上的IEnumerable的分页列表调用将使Entity Framework执行查询以检索总行数,这可能是1000(它简单{{1}在数据库中,它根本不会获得1000条记录),第二次调用来检索你想要的count的实际记录/对象(例如,10条记录)。

如果我有一个实体列表,其中1000个对象因为我的代码名为pageSize作为我的第一个示例,PagedList仍然会识别ToList()(列表)有1000个项目,并且会对您的10条记录进行分页,不对数据库执行任何查询(因为您的列表已经实现)。虽然,你的方法无论如何都从数据库中返回了1000行,这比进行两次查询更糟糕(一次获得10条记录,一项计数识别查询将返回1000条)。