2013-07-25 20 views
5

Mam ten fragment kodu pracuję z:Szczegółowe zakres pozycji listy (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(); 

Wszystko to nie jest podjąć wyniki GetLibraries(searchTerm), która zwraca listę LibrarySearchResult obiektów i zamienia je na listę LibrarySearchResultsViewModel.

Chociaż działa to dobrze w przypadku małych zestawów wyników, po tym, jak dostanę się do 1000, naprawdę zaczyna się przeciągać, co zajmuje około 12 sekund, zanim zakończy konwersję.

Moje pytanie:

Ponieważ używam stronicowania tutaj, naprawdę tylko trzeba wyświetlić część danych, które jest zwracane w dużym zestawie wyników. Czy istnieje sposób użycia czegoś takiego jak Take() lub GetRange(), aby konwersja zachodziła tylko dla rekordów, które muszę wyświetlić? Wypowiedz na 1000 rekordów, chcę tylko uzyskać zapisy od 20 do 40 i przekonwertować je na modele widoku.

Jestem za wszelkie sugestie dotyczące poprawy lub refaktoryzacji tego kodu, jak również.

+1

Zobacz najczęściej zadawane pytania dotyczące podpisów. http://stackoverflow.com/help/behavior W szczególności 'Nie używaj podpisu, sloganu ani pozdrowienia. Każdy wpis jest już "podpisany" standardową kartą użytkownika, która prowadzi bezpośrednio do strony użytkownika. Jeśli użyjesz dodatkowego podpisu lub sloganu, zostanie on usunięty, aby zmniejszyć hałas w pytaniach i odpowiedziach. " – cadrell0

+0

Cieszę się, że mogę pomóc. Zalecamy przeczytanie Najczęściej zadawanych pytań w całości, aby upewnić się, że postępujesz zgodnie ze wskazówkami dla społeczności. Polecam również ten post na meta, aby uzyskać więcej informacji. http://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites – cadrell0

Odpowiedz

21

Zastosowanie Skip i Take:

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

Można go łatwo paginate (musisz page i pageSize).

Z drugiej strony używasz ToList istnieje, należy rozważyć użycie tylkoIEnumerable, konwersja do listy mogą pochłonąć dużo czasu, zwłaszcza dla dużego zbioru danych.

7

Możesz użyć razem Skip() i Take(), aby włączyć stronicowanie.

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

+1 za dołączenie idx/numer strony – cadrell0

+0

Walkhard był o minutę wcześniejszy, ale działa to również dobrze. +1 – X3074861X

Powiązane problemy