2013-07-25 15 views
5

私はこのコードブロックは、私が働いていますリスト項目(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(); 

このすべては、LibrarySearchResultオブジェクトのリストを返すGetLibraries(searchTerm)、結果を取るではないとそれらをLibrarySearchResultsViewModelのリストにマップします。

これは小さな結果セットではうまくいくが、1,000になると実際にドラッグが始まり、変換が完了するまで約12秒かかります。

私の質問:

私はここにページングを使用していますので、私は本当に唯一の大規模な結果セットに返されていたデータの一部を表示する必要があります。 Take()またはGetRange()のようなものを利用する方法があるので、表示する必要があるレコードに対してのみ変換が行われますか? 1,000レコードから言えば、私はレコード20から40を取得し、それらをビューモデルに変換したいだけです。

このコードの改善やリファクタリングに関する提案もあります。

+1

署名に関するよくある質問をご覧ください。 http://stackoverflow.com/help/behavior特に、署名、タグライン、または挨拶を使用しないでください。 あなたが作るすべての投稿は、あなたのユーザーページに直接リンクしている標準のユーザーカードですでに "署名"されています。追加の署名やタグラインを使用すると、質問と回答のノイズを減らすために削除されます。 ' – cadrell0

+0

喜んで支援します。あなたがコミュニティガイドラインに従っているかどうかを確認するために、FAQを読むことをお勧めします。私はさらに詳しい情報については、このポストをメタでお勧めします。 http://meta.stackexchange.com/questions/7931/faq-for-stack-exchange-sites – cadrell0

答えて

21

使用SkipTake

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

あなたは簡単にページ付けすることができます(pagepageSizeが必要です)。

あなたがそこに ToListを使用している一方

は、だけIEnumerableを使用することを検討して、リストへの変換は、特に大規模なデータセットのために、多くの時間を食べることができます。

7

Skip()Take()を一緒に使用してページングを有効にすることができます。

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

+1を含むidx /ページ番号 – cadrell0

+0

ウォークハードはもう少し早く、しかしこれも素晴らしいです。 +1 – X3074861X

関連する問題