【问题标题】:ToPagedList returns all recordsToPagedList 返回所有记录
【发布时间】:2013-11-05 08:18:51
【问题描述】:

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

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

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

谢谢

乔治

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

嗨,马丁

下面是我的分页设置:

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 

谢谢

【问题讨论】:

    标签: c# pagedlist


    【解决方案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&lt;&gt; 用作query,分页列表将执行查询到您想要的记录数。

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

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

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

    这意味着,例如,如果您使用 Entity Framework 并使用非物化 IEnumerable(或者,IQueryable 作为我的第二个实现),分页列表调用Count() IEnumerable 上的 Count() 将使 Entity Framework 执行查询以检索总行数,可能是 1000(这是数据库中的简单 count,它根本不会得到 1000 条记录),并且第二次调用以检索您想要的pageSize 的实际记录/对象(例如,10 条记录)。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-26
        • 1970-01-01
        • 2021-12-04
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2015-07-17
        相关资源
        最近更新 更多