0

我有一个PredicateBuilder表达式,它返回一个IQueryable这样的(人为的例子):

var predicate = PredicateBuilder.True<CoolEntity>();
predicate = predicate.And(x => x.id > 0);
IQueryable<CoolEntity> results = CoolEntityRepository
                                    .FindBy(predicate)
                                    .OrderByDescending(x => x.id);

然后我使用它来生成一个分页列表,其中只包含给定页面的结果,使用 MVC 索引控制器来处理CoolEntity实体,如下所示:

int total = results.Count(); //Used by my controller to show the total number of results
int pageNumber = 2;
int pagesize = 20;
//Only get the entities we need for page 2, where there are 20 results per page
List<CoolEntity> resultList = results
                                .Skip(pageNumber * pageSize)
                                .Take(pageSize)
                                .ToList()

此查询确保每个页面只返回相关结果,因为通过存储库从 SQL 数据库返回了数千条记录。它一直运行良好。

问题是,我现在希望能够找出我需要为特定实体返回的索引的哪些分页页面。例如,假设我的 CoolEntity 对象之一的 ID 为 5 -pageNumber如果我想为我的 Index 控制器加载该实体所在的分页页面,我如何确定该值需要是什么?

具体来说,我怎样才能发现对于results,ID 为 5 的实体是第 651 行,并因此使用这个数字来确定pageNumber(即Math.Ceiling(651/pagesize)或类似的东西)?有更好的方法吗?

4

1 回答 1

0

我的一位同事为此提出了一个似乎非常快的解决方案。

results 
   .Select( x => x.id)
       .ToList()
       .Select((entry, index) => new { ID = entry, Rank = index + 1, PageNumer = ((index+ 1) / pagesize ) + 1 })
       .Where(x => x.id== 5)

在 Linqpad 中进行测试时,这发现了大约 00:00.191 秒内约 100000 条记录的结果。如果您有更有效的方法,请告诉我。

于 2012-11-29T23:57:09.497 回答