我正在尝试按类别分组;
假设我有两个表如下:
Products
,ProductTypes
var foo = (from products in context.PRODUCTS
join producttype in context.PRODUCTTYPE
group producttype by new {producttype.name, producttype.producttypeid, products.productid} into g
select new
{
ProductName = g.Key.name,
ProductID = g.Key.producttypeid,
NumItems = g.Distinct().Count()
});
以下是示例数据
Product (productId, Name, ProductTypeID)
-------
1 ProductA 1
2 ProductB 1
3 ProductC 2
4 ProductD 3
ProductType (ProductTypeID, Name)
-----------
1 CategoryA
2 CategoryB
3 CategoryC
ProductSubType (ProductSubtypeID, Name, ProductID)
--------------
1 ProductSubType1 1
2 ProductSubType2 1
3 ProductSubType3 2
4 ProductSubType4 2
5 ProductSubType5 2
6 ProductSubType6 2
7 ProductSubType7 3
我的结果如下
CategoryA 1
CategoryA 1
CategoryB 1
CategoryC 1
我期待结果
CategoryA 2
CategoryB 1
CategoryC 1
这是正确的,但CategoryA
应显示为CategoryA 2
。
我不确定我在这里缺少什么简单的语法?
先谢谢。
答案 0 :(得分:1)
您当前正在按组合键(name,producttypeid,productid)进行分组 - 这些组合的任何唯一组合都将显示为单独的组。听起来你只想producttypeid
分组。
修改强>
首先你的LINQ查询似乎缺少一个部分(连接标准),它应该更像这样甚至编译:
var results = (from products in Products
join productType in ProductTypes
on products.ProductTypeID equals productType.ProductTypeId
group productType by new { productType.Name, productType.ProductTypeId, products.ProductId } into g
select new
{
ProductName = g.Key.Name,
ProductID = g.Key.ProductTypeId,
NumItems = g.Distinct().Count()
}).ToList();
您的复合键(Name,ProductTypeId,ProductId)定义了数据分组的唯一元素。查看您提供的示例数据,您可以快速看到有四种独特的组合:
(Name, ProductTypeId, ProductId)
(CategoryA, 1, 1)
(CategoryA, 2, 1)
(CategoryB, 3, 2)
(CategoryC, 4, 3)
这就是你提供输出的原因:
(Name, ProductId)
CategoryA 1
CategoryA 1
CategoryB 1
CategoryC 1
要获得您希望拥有的组,可以使用常规的Linq组连接(将名称标准化为驼峰案例):
var ProductTypeList = (from productType in ProductTypes
join product in Products
on productType.ProductTypeId equals product.ProductTypeID into prod
select new
{
ProductTypeId = productType.ProductTypeId,
Name = productType.Name,
Products = prod.ToList(),
NumItems = prod.Count()
}).ToList();
foreach (var item in ProductTypeList)
{
Console.WriteLine("{0} : {1}", item.Name, item.NumItems);
}
输出:
CategoryA : 2
CategoryB : 1
CategoryC : 1
请告诉我这是你所追求的。