2016-05-26 1 views
0

J'ai 3 fonctions différentes sur ma page. 1.) Rechercher, 2.) Trier et 3.) PagingPage à travers l'ensemble de données sans avoir de nouveau jeu de données dans MVC C#

J'ai tout cela fonctionne, mais je me demandais si quelqu'un sait comment, ou peut me pointer quelque part qui montre comment enregistrer, par utilisateur, l'ensemble de données afin qu'ils puissent trier et la page sans chercher à nouveau, puis également lorsque l'utilisateur effectue une recherche pour récupérer les données.

J'utilise actuellement MVC5, Bootstrap et PagedList.MVC

Voici un exemple de ce que je dois. Honnêtement, je ne suis pas sûr de savoir comment ou même si je devrais mettre les données en cache, mais il semble que je voudrais car ces données changent régulièrement (ce sont des événements d'une base de données) et j'aimerais que l'utilisateur travaille avec l'ensemble de données cherché et non avec un nouveau jeu de données chaque fois qu'ils font la page ou le tri.

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); 
} 
+0

vous pouvez effectuer toutes ces opérations en accédant 'DataSet.Tables [0] .DefaultView' – techspider

+0

Regardez l'article https: // msdn .microsoft.com/fr-fr/library/69c06922 (v = vs.71) .aspx – techspider

+0

Désolé, ce n'était pas clair. J'appelle d'abord ViewLogs() et montre les données. Ensuite, ils affichent soit un tri, une page, ou une recherche et il appelle ViewLogs (modèle) et les données que j'ai eues ne sont plus là. La seule façon pour moi de le récupérer est de rappeler l'ensemble de données. Je suis à la recherche d'un moyen de conserver les données entre les publications. –

Répondre

0

Basé sur les commentaires sous ma question, vous pouvez faire à ce sujet 2 façons. Le moyen pas si bon, mais fonctionne utilise Session pour enregistrer les données et le remplir conditionnellement.

Ce que j'ai fait sur la recherche est d'utiliser réellement SQL pour faire la pagination. Dans SQL, vous définissez quelque chose de similaire qui vous donnera le nombre total de lignes, le nombre total de pages, et ensuite la valeur des pages. D'après ce que je comprends, en particulier en traitant de gros morceaux de données, cela peut sauver un massive fois. Merci à tous de m'avoir mis sur la bonne voie.

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 

Il y a un joli article détaillé sur le sujet ici: http://sqlperformance.com/2015/01/t-sql-queries/pagination-with-offset-fetch