我在找到这个问题的答案时遇到了问题,我在这里只发现了另外一个问题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
由于
答案 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条)。