gpt4 book ai didi

c# - 将 orderby 应用于 C# LINQ 内连接

转载 作者:行者123 更新时间:2023-11-30 14:30:14 24 4
gpt4 key购买 nike

我正在尝试 C# LINQ 从 this msdn page 加入.

我无法在内部联接上应用 order by,即使它适用于组联接。

运行查询的数据是:

    class Product
{
public string Name { get; set; }
public int CategoryID { get; set; }
}

class Category
{
public string Name { get; set; }
public int ID { get; set; }
}

// Specify the first data source.
static List<Category> categories = new List<Category>()
{
new Category(){Name="Beverages", ID=001},
new Category(){ Name="Condiments", ID=002},
new Category(){ Name="Vegetables", ID=003},
new Category() { Name="Grains", ID=004},
new Category() { Name="Fruit", ID=005}
};

// Specify the second data source.
static List<Product> products = new List<Product>()
{
new Product{Name="Cola", CategoryID=001},
new Product{Name="Tea", CategoryID=001},
new Product{Name="Mustard", CategoryID=002},
new Product{Name="Pickles", CategoryID=002},
new Product{Name="Carrots", CategoryID=003},
new Product{Name="Bok Choy", CategoryID=003},
new Product{Name="Peaches", CategoryID=005},
new Product{Name="Melons", CategoryID=005},
};

所需的输出是(在括号中按类别列出顺序,然后按产品列出):

Cola(Beverages)
Tea(Beverages)
Mustard(Condiments)
Pickles(Condiments)
Melons(Fruit)
Peaches(Fruit)
Bok Choy(Vegetables)
Carrots(Vegetables)

我能够使用 group-joinorderby 和第二个 from-select 来生成此输出,以变形组层次结构并生成普通列表如下:

var listGroupJoinOrderBy =
from category in categories
join product in products on category.ID equals product.CategoryID into prodGroup
from prod in prodGroup
orderby category.Name, prod.Name //first order by category name then product name
select
new
{
Category = category.Name,
Product = prod.Name
};

但是我无法通过将 orderby 应用于内部联接(即没有 into 子句的组联接)来生成相同的输出。我尝试了以下变体:

变体#1

var innerJoinOrderBy =
from category in categories
orderby category.Name //orderby category name
join product in products on category.ID equals product.CategoryID
orderby product.Name //orderby product name
select
new
{
Category = category.Name,
Product = product.Name
};

变体#2

var innerJoinOrderBy =
from category in categories

join product in products on category.ID equals product.CategoryID
orderby category.Name, product.Name //orderby category first and then by product name
select
new
{
Category = category.Name,
Product = product.Name
};

然而,两种变体都提供相同的输出,就好像没有使用 orderby 一样,并产生以下输出:

Cola (Beverages)
Tea (Beverages)
Mustard (Condiments)
Pickles (Condiments)
Carrots (Vegetables)
Bok Choy (Vegetables)
Peaches (Fruit)
Melons (Fruit)

问。如何使用 inner-joinorderby 生成所需的输出?

无论如何,要打印查询结果,可以使用以下 foreach(只需更改查询变量名称):

foreach (var product in simpleInnerJoin)
{
Console.WriteLine(product.Product + " (" + product.Category + ")");
}

最佳答案

你的第二个选项应该可以正常工作

var innerJoinOrderBy =
from c in categories
join p in products on c.ID equals p.CategoryID
orderby c.Name, p.Name
select new {
Category = c.Name,
Product = p.Name
};

输出:

[
{ Product="Cola", Category="Beverages" },
{ Product="Tea", Category="Beverages" },
{ Product="Mustard", Category="Condiments" },
{ Product="Pickles", Category="Condiments" },
{ Product="Melons", Category="Fruit" },
{ Product="Peaches", Category="Fruit" },
{ Product="Bok Choy", Category="Vegetables" },
{ Product="Carrots", Category="Vegetables" }
]

从您的输出中,我看到项目按其原始顺序排列。确保您在查询中应用了 orderby 运算符。

关于c# - 将 orderby 应用于 C# LINQ 内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com