c# - LINQ group by 连接并计算同一项目的出现次数

标签 c# linq

我有两张表,一张用于类别,一张用于产品

它们的定义方式如下:

public class Product
{
    public int ProductID{get;set;}
    public string ProductName{get;set;}
    public int CompanyID{get;set;}
    public int CategoryID{get;set;}
}

public class Category
{
    public int CategoryID{get;set;}
    public string CategoryName{get;set;}
}

这两个表通过 CategoryID 连接

我正在尝试获取类别列表,其中包含生产该类别产品的公司数量

因此,这不是按类别计算有多少产品,而是有多少家不同的公司为每个类别生产产品。

我已经尝试过这个查询,但无法得到正确的结果:

var query =
    from c in categories
    join p in products on c.CategoryID equals p.CategoryID
    group c by new {c.CategoryName,p.CompanyID} into cg
    select new
    {
        CatName = cg.Key.CategoryName,
        Count = cg.Count()
    };

我在这里准备了一个带有示例数据的 fiddle :

https://dotnetfiddle.net/WHwNFk

fiddle 的结果应该是:A=2,B=2,C=2(因此对于每个类别,有 2 个不同的公司生产该类别的产品)

最佳答案

以下 LINQ 语句将为您提供所需的结果。我们首先必须根据类别 ID 将类别加入到产品中,然后按类别 ID 进行分组并选择公司 ID 的不同计数

 var query = categories.Join(products, 
                             x => x.CategoryID, 
                             z => z.CategoryID, (x, z) => new
                             {
                                  Category = x.CategoryName,
                                  Company = z.CompanyID
                             }).GroupBy(x => x.Category).Select(x => new 
                             {
                                  CatName = x.Key,
                                  Count = x.Distinct().Count()
                             }).ToList();

输出:

A=2,B=2,C=2

关于c# - LINQ group by 连接并计算同一项目的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660772/

相关文章:

c# - UWP (Windows 10) 应用程序提交失败

c# - 优化此 C# 算法

c# - C# 编译器会通过将 var 转换为 const 来优化此代码吗?

C# Entity Framework Linq : Select Where If/Else

c# - 将 SQL 查询转换为 LINQ(子查询)

c# - 在 Object Collection 中的 Entity 框架中拆分字符串,即在 New {} 中

c# - “逆向工程”模型优先 - 删除表和列前缀

c# - 具有多个输入的单元测试

c# - LINQ 多对多计数分组

c# - Linq 的 except 方法不适用于字节值