我有两个表格,一个用于类别,一个用于产品
它们是通过以下方式定义的:
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个不同的公司在该类别中生产产品)
答案 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() });