【问题标题】:LINQ group by with join and count occurence of the same itemLINQ group by 加入并计算同一项目的出现次数
【发布时间】:2019-02-13 00:34:01
【问题描述】:

我有两张表,一张用于categories,一张用于products

它们的定义如下:

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 家不同的公司生产该类别的产品)

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    以下 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

    【讨论】:

      【解决方案2】:

      这会给你预期的结果;基本上你需要在计数中添加一个 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() });
      

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        相关资源
        最近更新 更多