排序查找orderby

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() 时才真正执行

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注