获取列表项的特定范围(LINQ)

时间:2013-07-25 16:49:07

标签: c# 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();

所有这一切都取GetLibraries(searchTerm)的结果,后者返回LibrarySearchResult个对象的列表,并将它们映射到LibrarySearchResultsViewModel的列表。

虽然这适用于小型结果集,但一旦我进入1000,它就会开始拖动,大约需要12秒才能完成转换。

我的问题:

由于我在这里使用分页,我实际上只需要显示在大型结果集中返回的一小部分数据。有没有办法利用Take()GetRange()之类的东西,以便转换只发生在我需要显示的记录上?在1,000条记录中,我只想获取20到40条记录,并将它们转换为视图模型。

我也是关于改进或重构此代码的任何建议。

2 个答案:

答案 0 :(得分:21)

使用SkipTake

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

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

另一方面,你在那里使用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 => ...);