我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)
这里,GetRange(page * 10, 10) 调用可以在多种情况下抛出异常,例如,当列表少于10个元素或者page * 10索引超出范围时.
这可以通过大量绑定检查来解决.我想知道,有更优雅的解决方法吗?我正在寻找能够在可能的情况下返回10个元素的解决方案,否则返回尽可能多的元素或null /空列表.
例如,27个元素的列表,第一个和第二个页面(page == 0 || page == 1)将返回包含10个元素的列表,第三个页面(page == 2)将返回7个元素,第四个页面(page == 3)将返回null /空列表.
你不想.ToList()在分页之前使用,因为这将拉入所有记录并在代码中进行过滤,这将损害性能.
只需使用.Skip()和.Take(),它将被实体框架转换为正确的SQL:
int pageSize = 10;
var blogPosts = db.BlogPosts
.OrderByDescending(i => i.PublishTime)
.Skip(page * pageSize)
.Take(pageSize)
.ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |