对 join 子句的结果进行排序

此示例演示如何对联接运算的结果进行排序。 请注意,排序在联接之后执行。 虽然可以在联接之前将 orderby 子句用于一个或多个源序列,不过通常不建议这样做。 某些 LINQ 提供程序可能不会在联接之后保留该排序。

备注

本主题中的示例使用以下数据类:

record Product(string Name, int CategoryID);
record Category(string Name, int ID);

示例

此查询创建一个分组联接,然后基于类别元素(仍处于范围中)对组进行排序。 在匿名类型初始值设定项内,一个子查询对来自产品序列的所有匹配元素进行排序。

List<Category> categories = new()
{
    new(Name: "Beverages", ID: 001),
    new("Condiments", 002),
    new("Vegetables", 003),
    new("Grains", 004),
    new("Fruit", 005)
};

List<Product> products = new()
{
    new(Name: "Cola", CategoryID: 001),
    new("Tea", 001),
    new("Mustard", 002),
    new("Pickles", 002),
    new("Carrots", 003),
    new("Bok Choy", 003),
    new("Peaches", 005),
    new("Melons", 005),
};

var groupJoinQuery2 =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    orderby category.Name
    select new
    {
        Category = category.Name,
        Products =
            from prod2 in prodGroup
            orderby prod2.Name
            select prod2
    };

foreach (var productGroup in groupJoinQuery2)
{
    Console.WriteLine(productGroup.Category);
    foreach (var prodItem in productGroup.Products)
    {
        Console.WriteLine($"  {prodItem.Name,-10} {prodItem.CategoryID}");
    }
}

/* Output:
    Beverages
      Cola       1
      Tea        1
    Condiments
      Mustard    2
      Pickles    2
    Fruit
      Melons     5
      Peaches    5
    Grains
    Vegetables
      Bok Choy   3
      Carrots    3
 */

请参阅