2013-07-25 15 views
5

ho questo blocco di codice con cui sto lavorando:Ottenere specifica gamma di voci di elenco (LINQ)

// get the collection of librarys from the injected repository 
librarySearchResults = _librarySearchRepository.GetLibraries(searchTerm); 

// map the collection into a collection of LibrarySearchResultsViewModel view models 
libraryModel.LibrarySearchResults = 
    librarySearchResults.Select(
     library => 
     new LibrarySearchResultsViewModel 
     { 
      Name = library.Name, 
      Consortium = library.Consortium, 
      Distance = library.Distance, 
      NavigateUrl = _librarySearchRepository.GetUrlFromBranchId(library.BranchID), 
      BranchID = library.BranchID 
     }).ToList(); 

Tutto questo non fa altro che prendere i risultati di GetLibraries(searchTerm), che restituisce un elenco di oggetti LibrarySearchResult, e li mappa su un elenco di LibrarySearchResultsViewModel.

Mentre questo funziona bene per piccoli set di risultati, una volta che mi alzo tra i 1.000, inizia davvero a trascinare, impiegando circa 12 secondi prima che finisca la conversione.

La mia domanda:

Dal momento che sto usando paginazione qui, ho davvero solo bisogno di visualizzare una frazione dei dati che viene restituito in un grande set di risultati. C'è un modo per utilizzare qualcosa come Take() o GetRange(), in modo che la conversione avvenga solo per i record che devo visualizzare? Dì su 1.000 record, voglio solo ottenere record da 20 a 40 e convertirli nei modelli di visualizzazione.

Sono tutti per qualsiasi suggerimento su come migliorare o refactoring questo codice.

+1

Vedere le domande frequenti sulle firme. http://stackoverflow.com/help/behavior Specificamente 'Non utilizzare firma, tagline o saluti. Ogni post che fai è già "firmato" con la tua carta utente standard, che collega direttamente alla tua pagina utente. Se si utilizza una firma aggiuntiva o uno slogan, verrà rimosso per ridurre il rumore nelle domande e nelle risposte. – cadrell0

+0

Felice di essere di aiuto. Ti consiglio di leggere le FAQ nella sua interezza per assicurarti di seguire le linee guida della community. Raccomando anche questo post su meta per maggiori informazioni. http://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites – cadrell0

risposta

21

Usa Skip e Take:

// take records from 20 to 40 
var records = librarySearchResults.Skip(20).Take(20); 

Si può facilmente impaginarlo (avrete bisogno page e pageSize).

D'altra parte si sta utilizzando ToList lì, è possibile utilizzare solo IEnumerable, la conversione alla lista può mangiare fino un sacco di tempo, soprattutto per le grandi set di dati.

7

è possibile utilizzare Skip() e Take() insieme per abilitare il paging.

var idx = // set this based on which page you're currently generating 
librarySearchResults.Skip(idx * numitems).Take(numitems).Select(lib => ...); 
+0

+1 per includere idx/numero di pagina – cadrell0

+0

Walkhard era un minuto prima, ma anche questo funziona alla grande. +1 – X3074861X

Problemi correlati