我正在使用Entity Framework从数据库加载数据。我有一个ASP MVC控制器,每页应显示10个元素,其中页码是传递给控制器的参数:
public ActionResult Blog([DefaultValue(0)] int page)
{
var blogPosts = db.BlogPosts.ToList()
.OrderByDescending(i => i.PublishTime)
.ToList()
.GetRange(page * 10, 10);
return View(blogPosts);
}
此处,GetRange(page * 10, 10)
调用可能会在多种情况下抛出异常,例如当列表少于10个元素或者page * 10
索引超出范围时。
这可以通过大量的绑定检查来解决。我想知道,有更优雅的解决方法吗?我正在寻找能够在可能的情况下返回10个元素的解决方案,否则返回尽可能多的元素或null /空列表。
例如,27个元素的列表,第一页和第二页(page == 0 || page == 1
)将返回包含10个元素的列表,第三页(page == 2
)将返回7个元素和第四页({{1} })将返回null /空列表。
答案 0 :(得分:6)
你不想在分页之前使用.ToList()
,因为这会拉入所有记录并在代码中进行过滤,这会影响性能。
只需使用.Skip()
和.Take()
,它们将被实体框架转换为正确的SQL:
int pageSize = 10;
var blogPosts = db.BlogPosts
.OrderByDescending(i => i.PublishTime)
.Skip(page * pageSize)
.Take(pageSize)
.ToList();