我有这个我正在使用的代码块:
// 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();
所有这一切都取GetLibraries(searchTerm)
的结果,后者返回LibrarySearchResult
个对象的列表,并将它们映射到LibrarySearchResultsViewModel
的列表。
虽然这适用于小型结果集,但一旦我进入1000,它就会开始拖动,大约需要12秒才能完成转换。
我的问题:
由于我在这里使用分页,我实际上只需要显示在大型结果集中返回的一小部分数据。有没有办法利用Take()
或GetRange()
之类的东西,以便转换只发生在我需要显示的记录上?在1,000条记录中,我只想获取20到40条记录,并将它们转换为视图模型。
我也是关于改进或重构此代码的任何建议。
答案 0 :(得分:21)
使用Skip
和Take
:
// take records from 20 to 40
var records = librarySearchResults.Skip(20).Take(20);
您可以轻松对其进行分页(您需要page
和pageSize
)。
另一方面,你在那里使用ToList
,考虑使用只是 IEnumerable
,转换到列表可能会耗费大量时间,特别是对于大型数据集。
答案 1 :(得分:7)
您可以同时使用Skip()
和Take()
来启用分页。
var idx = // set this based on which page you're currently generating
librarySearchResults.Skip(idx * numitems).Take(numitems).Select(lib => ...);