2013-07-25 18 views
5

Ben bu kod bloğu ile çalışıyorum adres:Liste Öğeler (LINQ) özel Aralığı alın

// 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(); 

Bütün bunlar, LibrarySearchResult nesnelerin listesini verir GetLibraries(searchTerm), sonuçlarını almak olduğunu mu ve Onları LibrarySearchResultsViewModel 's listesiyle eşleştirir.

Bu, küçük sonuç kümeleri için iyi bir performans sergiliyor olsa da, 1000'lere girdikten sonra, gerçekten dönüşüm işlemini tamamlamadan önce 12 saniye kadar sürmeye başlıyor.

Sorum: Burada disk belleği kullanıyorum yana

, gerçekten sadece büyük bir sonuç kümesindeki iade ediliyor verilerin bir kısmını göstermek gerekir. Take() veya GetRange() gibi bir şeyi kullanmanın bir yolu var mı, bu yüzden dönüşüm sadece göstermem gereken kayıtlar için mi gerçekleşiyor? 1.000 kayıttan diyelim, sadece 20'den 40'a kadar kayıt alıp bunları görünüm modellerine dönüştürmek istiyorum.

Bu kodun iyileştirilmesi ya da yeniden kodlanması ile ilgili önerileriniz için hepimiz benim.

+1

Lütfen imzalarla ilgili SSS bölümüne bakın. http://stackoverflow.com/help/behavior Özellikle 'İmza, slogan veya tebrik kullanmayın. Hazırladığınız her yazım, standart kullanıcı kartınızla birlikte, doğrudan kullanıcı sayfanıza yönlendiren "imzalanmış" halidir. Ek bir imza veya slogan kullanırsanız, soru ve cevaplarda gürültüyü azaltmak için kaldırılacaktır. ' – cadrell0

+0

Yardım almaktan memnun oldum. Topluluk kurallarına uyduğunuzdan emin olmak için SSS bölümünü tamamen okumanızı tavsiye ederim. Daha fazla bilgi için bu yazıyı meta olarak da öneriyorum. http://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites – cadrell0

cevap

21

Kullanım Skip ve Take:

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

Kolayca bunu paginate (ister page ve pageSize gerekir). Orada ToList kullandığınız diğer taraftan

, özellikle büyük veri seti için, sadece IEnumerable listeye dönüşüm çok zaman kadar yiyebilirsiniz kullanmayı düşünün.

7

, sayfalamayı etkinleştirmek için Skip() ve Take() öğelerini birlikte kullanabilirsiniz.

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

+1 idx/sayfa numarası eklemek için + – cadrell0

+0

Walkhard bir dakika daha erken oldu, ama bu da harika çalışıyor. +1 – X3074861X

İlgili konular