MVC domanda contrib pager - AsPagination
-
30-09-2019 - |
Domanda
Potrei sbagliarmi, ma è il metodo AsPagination non molto inefficiente in quanto fa schifo tutti i dati da un repository prima per inizializzare TotalItems ecc? Quindi paging non è usato per fare l'accesso ai dati più efficiente.
non ho trovato alcun esempio che utilizzano un repository e 'vero' paginazione (cioè utilizza TOP ecc in SQL atcual). Come faccio a utilizzare il cercapersone se ho un metodo di repository con questa firma:
IList GetData (int? Page, OUT INT TotalItems)
Qualsiasi commento sarebbe molto apprezzato. Grazie.
Christian
Soluzione
Si potrebbe utilizzare il CustomPagination<T>
classe che fa parte del MvcContrib in questo modo:
public ActionResult Index(int page)
{
int totalItems;
int pageSize = 10;
var data = Repository.GetData(page, out totalItems);
var paginatedData = new CustomPagination<Bla>(
data, page, pageSize, totalItems
);
return View(paginatedData);
}
e all'interno della vostra vista:
<%= Html.Pager(Model) %>
Altri suggerimenti
Credo che si può essere mal diretto con le assunzioni sulla efficienza di paging? Prova dare un'occhiata al sql di esecuzione in profiler - esegue due istruzioni SQL - uno per recuperare il conteggio e uno per selezionare la top 10. Di seguito è riportato i risultati del SQL eseguito da profiler -
Questa SQL recupera ottiene il conteggio - utilizzato dal cercapersone:
SELECT [GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Customer] AS [Extent1]
)
AS [GroupBy1]
Mentre il seguente è la SQL utilizzata per recuperare i dati:
SELECT TOP (10)
[Extent1].[CustomerId] AS [CustomerId],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
...
FROM ( SELECT [Extent1].[CustomerId] AS [CustomerId], [Extent1].[FirstName] AS [FirstName], [Extent1].[LastName] AS [LastName], ..., row_number() OVER (ORDER BY [Extent1].[Company] ASC) AS [row_number]
FROM [dbo].[Customer] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 20
ORDER BY [Extent1].[Company] ASC
Avviso TOP (10), row_number () sopra, e dove ...> 20 dichiarazioni nel secondo script SQL? Fa che il contribuire a chiarire?