【发布时间】:2018-05-31 18:29:50
【问题描述】:
这是 Jon Skeet 已回答问题的扩展,您可以 find here.
想要的结果如下:
A 100
A 80
B 80
B 50
B 40
C 70
C 30
考虑到你有以下课程:
public class Student
{
public string Name { get; set; }
public int Grade { get; set; }
}
可以通过 Jon Skeet 的回答来获得结果(在理想情况下):
var query = grades.GroupBy(student => student.Name)
.Select(group =>
new { Name = group.Key,
Students = group.OrderByDescending(x => x.Grade) })
.OrderBy(group => group.Students.FirstOrDefault().Grade);
但是,就我而言,我还必须在查询中支持分页。这意味着执行 SelectMany(),然后执行 Skip() 和 Take()。但要执行 Skip(),您必须应用 OrderBy()。这是我的订单再次中断的地方,因为我需要保留在 SelectMany() 之后获得的订单。
如何做到这一点?
var query = grades.GroupBy(student => student.Name)
.Select(group =>
new { Name = group.Key,
Students = group.OrderByDescending(x => x.Grade) })
.OrderBy(group => group.Students.FirstOrDefault().Grade).SelectMany(s => s.Students).OrderBy(something magical that doesn't break ordering).Skip(s => skip).Take(t => take);
我知道当我的查询实现时我可以再次手动对记录进行排序,但我想避免这种情况,并在一个从 LINQ 转换的 SQL 查询中完成所有这些操作。
【问题讨论】:
-
@IvanStoev 一切都好,不用担心
标签: c# linq linq-to-sql entity-framework-6