LINQ 中的排序(Order By)
SQL 中的排序
在 SQL 中,可以使用 ORDER BY 对查询结果按某个字段进行升序(ASC)或降序(DESC)排列:
SELECT s.ID, s.Name, p.Name AS ProductName, p.Price FROM Student s
INNER JOIN Product AS p
ON s.ID = p.Sid
ORDER BY p.Price DESCCode language: PHP (php)
LINQ 中的排序语法
在 LINQ 中,使用 orderby 关键字,配合 ascending(升序,默认)或 descending(降序)。
场景一:对 Group By 后的聚合结果排序
using (var db = new DataClasses1DataContext())
{
var query = from s in db.Student
join p in db.Product
on s.ID equals p.Sid
group new { s, p } by new { s.ID, s.Name } into g
orderby g.Sum(m => m.p.Price) ascending
select new
{
g.Key.ID,
g.Key.Name,
sum = g.Sum(m => m.p.Price)
};
var result = query.ToList();
}Code language: JavaScript (javascript)
说明:
| 步骤 | 代码 | 说明 |
|---|---|---|
| 连接 | join p in db.Product on s.ID equals p.Sid | 学生表与产品表内连接 |
| 分组 | group new { s, p } by new { s.ID, s.Name } into g | 按学生分组 |
| 排序 | orderby g.Sum(m => m.p.Price) ascending | 按每组的产品总价升序排列 |
| 投影 | select new { g.Key.ID, g.Key.Name, sum = ... } | 输出学生信息及总价 |
生成的 SQL 中,
ORDER BY会出现在GROUP BY和聚合计算之后,等效于:SELECT s.ID, s.Name, SUM(p.Price) AS sum FROM Student s INNER JOIN Product p ON s.ID = p.Sid GROUP BY s.ID, s.Name ORDER BY SUM(p.Price) ASCCode language: PHP (php)
场景二:对连接后的明细结果排序
using (var db = new DataClasses1DataContext())
{
var query = from s in db.Student
join p in db.Product
on s.ID equals p.Sid
orderby p.Price descending
select new { s, p };
var result = query.ToList();
}Code language: JavaScript (javascript)
说明:
| 步骤 | 代码 | 说明 |
|---|---|---|
| 连接 | join p in db.Product on s.ID equals p.Sid | 内连接 |
| 排序 | orderby p.Price descending | 按产品价格降序排列 |
| 投影 | select new { s, p } | 输出学生和产品对象 |
生成的 SQL 等效于:
SELECT s.ID, s.Name, p.Name, p.Price FROM Student s INNER JOIN Product p ON s.ID = p.Sid ORDER BY p.Price DESC
多字段排序
如果需要按多个字段排序,用逗号分隔:
// 先按学生姓名升序,再按产品价格降序
var query = from s in db.Student
join p in db.Product
on s.ID equals p.Sid
orderby s.Name ascending, p.Price descending
select new { s, p };Code language: JavaScript (javascript)
对应 SQL:
ORDER BY s.Name ASC, p.Price DESCCode language: CSS (css)
关键要点
| 对比项 | 说明 |
|---|---|
| 排序关键字 | orderby + ascending(可省略,默认升序)或 descending |
| 分组后排序 | 写在 group by ... into g 之后,可引用 g.Key 或聚合函数 |
| 明细排序 | 写在 join 之后、select 之前,引用任意投影字段 |
| 多字段排序 | 逗号分隔,从左到右依次生效 |
| 延迟执行 | 同其他 LINQ 操作符,ToList() 时才真正执行 |
Previous: 分组后进行过滤having的使用
Next: 取多少条记录Top的使用