我有一个场景,我必须使用 LINQ 以相反的方式获取分页记录。假设我有 15 件物品(按发布顺序排列):
1, 2, 3, 4, 5.......... 15
页面大小为 5,如果用户在我的方法中发送 1 作为
currentPage
。然后我应该能够返回 11, 12, 13, 14, 15
作为结果集,如果他发送 2 作为 currentPage
那么我应该返回 6, 7, 8, 9, 10
等等。如何设置为 Skip 方法提供的值,以便它以这种方式为我提供记录?是的,我也按日期升序排列这些物品。
只是一个简单的逻辑示例:
var nums = new[] {1, 2, 3, ..., 15};
var lastFew = nums.Reverse().Take(5).Reverse().ToArray();
或者作为列表:
var nums = new List<int> { 1, 2, 3, ..., 15};
nums.Reverse();
nums.RemoveRange(5); // removes from index 5 till end
nums.Reverse();
实际的实现可能会有所不同,具体取决于代码的设计方式等,但这应该可以帮助您入门。
这里使用的关键方法是:
Reverse
、Take
限制返回金额、Skip
选择起始索引。如果您使用 Skip
,您很可能可以完全避免使用 Reverse
。
我会这样做(使用 EF):
var resultByDesc = db.Entities
.OrderByDescending(o => o.DateTime)
.Skip(page * itemsPerPage)
.Take(itemsPerPage)
.ToList(); // important! eager loading!
// it will be executed in your client side, not SQL.
var actualResult = resultByDesc.Reverse();