使用自定义逻辑在MVC中分析大量数据

时间:2016-08-26 09:22:52

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我想在MVC中对大量数据(DB有2-3百万条记录)实施分页,搜索,排序。在MVC中使用默认分页选项(使用PagedList.Mvc@Html.PagedListPager)时,将获取所有记录以用于DB&页面上只显示100条记录。这很耗时&使用了更多的记忆。

如何在MVC中实现自定义逻辑,每页只检索100条记录?目前我正在尝试这两种方法(使用EF和SP)。

我已经使用EF& amp;已经开发了示例应用程序。 SP并实现默认分页。但是这两种方法都从DB&中检索所有记录。然后在客户端应用分页。这太费时了。

public ActionResult Index(int? page) { 
      return View(db.TestUploadData2.ToList().ToPagedList(page ?? 1, 100));
 }

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您遇到的问题是,您要将数据库中的所有内容都拉到C#内存中,然后然后只获取您想要显示的内容。

db.TestUploadData2.ToList() .ToList()是从数据库中提取的内容,因此您希望在此之前提取您的资格。

这样的事情应该是你需要做的事情:

public IEnumerable<TestUploadData2> GetPagedData(string prop1SearchValue,
                                                 string prop2SearchValue,
                                                 int pageNum = 1,
                                                 int pageSize = 20)
{
    var data = db.TestUploadData2;

    // No idea what your properties are, so I'll just wing with strings.
    if (!string.IsNullOrWhitespace(prop1SearchValue))
    {
        data = data.Where(d => d.Prop1 == prop1SearchValue);
    }

    // Did it like this so you can see how to conditionally filter the query
    if (!string.IsNullOrWhitespace(prop2SearchValue))
    {    
        data = data.Where(d => d.Prop2 == prop2SearchValue);
    }

               // If it is the first page, then 0 * pageSize,
               // second page, skip 1 * pageSize, etc.
    return data.Skip((pageNum - 1) * pageSize)
               // Take only what is being asked for.
               .Take(pageSize)
               // NOW pull it from the database.
               .ToList();
}

答案 1 :(得分:3)

以下是使用PagedList.Mvc的正确方法。

public ViewResult Index(int? page)
{
   int pageSize = 100;
   int pageNumber = (page ?? 1);
   return View(db.TestUploadData2.ToPagedList(pageNumber, pageSize));
}

您可以在Paging with the Entity Framework文章中详细了解此信息。