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

时间:2014-11-29 13:31:15

标签: c# .net

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

1 个答案:

答案 0 :(得分:6)

你不想在分页之前使用.ToList(),因为这会拉入所有记录并在代码中进行过滤,这会影响性能。

只需使用.Skip().Take(),它们将被实体框架转换为正确的SQL:

int pageSize = 10;
var blogPosts = db.BlogPosts
                  .OrderByDescending(i => i.PublishTime)
                  .Skip(page * pageSize)
                  .Take(pageSize)
                  .ToList();