List.GetRange的替代品无一例外?

isk*_*nar 0 .net c#

我正在使用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 /空列表.

Cod*_*ter 6

你不想.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)