浏览数据集而不在MVC中获取新数据集c#

时间:2016-05-26 19:32:58

标签: c# asp.net-mvc asp.net-mvc-5 paging pagedlist

我的页面上有3个不同的功能。 1.)搜索,2。)排序和3.)分页

我已经完成了所有这些工作,但我想知道是否有人知道如何,或者可以指向某个地方,显示如何为每个用户保存数据集,以便他们可以排序和分页而无需再次搜索,然后也可以在用户搜索再次提取数据。

我目前正在使用MVC5,Bootstrap和PagedList.MVC

这是我需要的一个例子。老实说,我不确定如何或者即使我应该缓存数据,但似乎我想要这些数据定期更改(它们是来自数据库的事件)并且我希望用户使用他们搜索的数据集,而不是每次页面或排序时都使用新的数据集。

private List<Models.EventItem> events = null;

[HttpPost]
public ActionResult ViewLogs(ViewModels.ViewLogs model)
{
    if (model.ActionPerformed == "search")
    {
        // it was a search, so let's pull new events in.
        events = Business.Events.GetEvents(GetCurrentSearchParameters(model));
    }

    if (model.ActionPerformed == "sort")
    {
        events = null // need to grab events from the cached dataset?
        // then need to perform the sort on the cached dataset.
    } 

    if (model.ActionPerformed == "page")
    {
        events = null // need to grab events from the cached dataset?
    }

    model.EventItems = events.ToPagedList(model.CurrentPage, model.PageSize);
    return View("ViewLogs", model);
}

[HttpGet]
public ActionResult ViewLogs()
{
    // ViewLogs (Get) will take defaults instead.
    ViewModels.ViewLogs model = new ViewModels.ViewLogs();

    events = Business.Events.GetEvents(GetCurrentSearchParameters(model));
    model.EventItems = events.ToPagedList(model.CurrentPage, model.PageSize);

    return View(model);
}

1 个答案:

答案 0 :(得分:0)

根据我的问题中的评论,您可以采用这两种方式。不太好的方式,但是工作是使用Session来保存数据并有条件地填充它。

我所做的研究是实际使用SQL来进行分页。在SQL中,您可以设置与此类似的内容,它将为您提供总行数,总页数,以及任何页面数据。根据我的理解,特别是处理大块数据,这可以节省大量的时间。感谢所有人让我走上正轨。

BEGIN
DECLARE @fromDate DATETIME = DATEADD(d, -30, GETUTCDATE()) 
DECLARE @page INT = 1
DECLARE @perPage INT = 25
DECLARE @totalRows INT = 0
DECLARE @totalPages INT = 0
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   --
   SELECT @totalRows = COUNT(*)
   FROM 
          dbo.[Events] a
   WHERE
          a.[EventTime] >= @fromDate
   ;
   --
   BEGIN TRY
          SET @totalPages = CEILING(@totalRows / @perPage); 
   END TRY
   BEGIN CATCH
          SET @totalPages = 0
   END CATCH
   --
   SELECT @totalRows AS [TotalRows], @totalPages AS [TotalPages];
   --
   --
   SELECT
          a.[EventTime],
          a.[Column1],
          a.[Column2]
   FROM 
          dbo.[Events] a
   WHERE
          a.[EventTime] >= @fromDate
   ORDER BY 
          a.[EventTime] DESC
          OFFSET (@page * @perPage) ROWS
          FETCH NEXT @perPage ROWS ONLY
   ;
END

这里有一篇非常深入的文章:http://sqlperformance.com/2015/01/t-sql-queries/pagination-with-offset-fetch