LINQ按连接进行合并并计数同一项目的出现

时间:2019-02-13 00:34:02

标签: 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()
    };

我准备了一个小提琴,准备好此处的示例数据:

https://dotnetfiddle.net/WHwNFk

摆弄小提琴的结果应该是:A = 2,B = 2,C = 2(因此,对于每个类别,都有2个不同的公司在该类别中生产产品)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这将为您带来预期的结果;基本上,您需要在计数中添加一个Distinct,然后再次分组以对项目进行计数:

var qry =  (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.Distinct().Count()
            })
            .GroupBy(x => x.CatName)
            .Select(y => new { CatName = y.Key, Count = y.Count() });