5

I have this block of code I'm working with :

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

All this does is take the results of GetLibraries(searchTerm), which returns a list of LibrarySearchResult objects, and maps them over to a list of LibrarySearchResultsViewModel's.

While this works well for small result sets, once I get up into the 1,000's, it really starts to drag, taking about 12 seconds before it finishes the conversion.

My question :

Since I'm using paging here, I really only need to display a fraction of the data that's being returned in a large result set. Is there a way to utilize something like Take() or GetRange(), so that the conversion only happens for the records I need to display? Say out of 1,000 records, I only want to get records 20 through 40, and convert them over to the view models.

I'm all for any suggestions on improving or refactoring this code as well.

4

2 回答 2

23

使用SkipTake

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

您可以轻松地对其进行分页(您需要pagepageSize)。

另一方面,您在ToList那里使用,请考虑使用just IEnumerable,转换为列表会占用大量时间,尤其是对于大型数据集。

于 2013-07-25T16:50:52.843 回答
7

您可以使用Skip()Take()一起启用分页。

var idx = // set this based on which page you're currently generating
librarySearchResults.Skip(idx * numitems).Take(numitems).Select(lib => ...);
于 2013-07-25T16:51:52.723 回答