2012-04-13 13 views
9

C'è un modo per ottenere il conteggio delle righe di una query Linq complessa e milioni di record senza colpire il db due volte o scrivere 2 query separate ??Impaginazione quadro entità C#

Potrei avere il mio suggerimento. Scrivi una procedura memorizzata, ma sto bene con MySQL non MSSQL.

Qualsiasi suggerimento migliore sarebbe fantastico. Inoltre, se qualcuno sa se Microsoft sta lavorando per aggiungere questa funzionalità al framework entità.

+3

Sono abbastanza sicuro che non è possibile ottenere il numero di righe nella query senza colpire il database o scrivere una query separata da quella che effettivamente restituisce quelle righe. –

+0

Grazie @JonathanWood per i tuoi pensieri! –

+1

Quando si usa .Count() in EF, non seleziona tutte le righe, esegue solo un 'select count() dalla tabella 'sql statement - quindi, mentre sono necessarie 2 query, una di queste è molto economica. –

risposta

2

Il modo comune per mostrare milioni di record è semplicemente non visualizzare tutte le pagine. Pensaci: se hai milioni di record, diciamo 20 o anche 100 elementi per pagina, avrai decine di migliaia di pagine. Non ha senso mostrarli tutti. Puoi semplicemente caricare la pagina corrente e fornire un collegamento alla pagina successiva, il gioco è fatto. Oppure si può caricare dire 100-500 record, ma ancora mostrare solo una pagina e utilizzare le informazioni dei record caricati per generare collegamenti di pagina per le prime pagine (in modo da sapere con certezza quante pagine successive sono disponibili).

+0

Hai ragione, non vorrei mostrare centinaia o migliaia di link o anche far fare a qualcuno un passaggio attraverso quelle pagine. Immagino che il problema che sto avendo è che voglio scrivere solo una query.Ad esempio: MySQL ti ha permesso di usare SQL_CALC_FOUND_ROWS all'interno di una query e poi un'altra query per ottenere solo quel risultato. Molto efficiente!!! Fatto Paginazione meravigliosa! Grazie a @VladimirPerevalov per i tuoi pensieri! –

+0

AFAIK non esiste alcun supporto in LINQ né in MS SQL Server. In realtà ci sono molte cose che MySql fa e MS SQL no. Per esempio. 'SELEZIONA TRA ... 'è anche molto efficace per l'impaginazione. –

+0

puoi anche fornire una casella di testo "Vai a:" e un pulsante per passare direttamente a una pagina specifica. –

8

Suggerirei di utilizzare la funzione Take(). Questo può essere usato per specificare il numero di record da prendere da una query linq o da List. Per esempio

List<customers> _customers = (from a in db.customers select a).ToList(); 
var _dataToWebPage = _customers.Take(50); 

Io uso una tecnica simile a un app MVC dove scrivo la lista _customers alla sessione e quindi utilizzare questa lista per ulteriori domande impaginazione quando l'utente fa clic sulla pagina 2, 3 ecc Ciò consente di risparmiare di più hits del database. Tuttavia, se la tua lista è molto grande, allora scrivendo anche la sessione probabilmente non è una buona idea.

Per l'impaginazione è possibile utilizzare la funzione Skip() e Take() insieme. Ad esempio, per ottenere la pagina 2 dei dati:

var _dataToWebPage = _customers.Skip(50).Take(50); 
+0

Grazie @TimNewton. Certo, ma se ho un milione di record o meglio ancora un migliaio di record con colonne di dati molto grandi, si verifica un'eccezione di memoria insufficiente. –

+0

Jason, potresti considerare di scrivere le chiavi primarie di un elenco nella sessione piuttosto che l'intero oggetto, quindi recuperare i dettagli dal database ogni volta che è necessario visualizzare nuovamente i dati utilizzando le chiavi primarie dall'elenco? Ciò richiede comunque più letture di database. Non penso che tu possa andare via senza più db read se il set di dati è così grande. –

+0

potresti avere ragione a non essere in grado di fare un db letto per questa istanza in C# e usando Linq. So che questo può essere fatto, è solo che voglio la possibilità di usare Linq per questo è fortemente digitato e va con il resto del mio codice pulito. L'impaginazione funziona perfettamente su tabelle più piccole che non contengono serie di dati di grandi dimensioni o dati di grandi dimensioni. –

2

è così facile sul server SQL. è possibile scrivere questa query:

select count() over(), table.* from table 

il conteggio() su() restituirà il conteggio del totale riga nel risultato, quindi non è necessario eseguire due query di .. ricordare che si dovrebbe correre cruda sql sul tuo contesto o usa dapper che restituisce il risultato come modello di vista

Problemi correlati