Linq分组问题

时间:2011-02-24 18:52:13

标签: linq

我正在尝试按类别分组;

假设我有两个表如下:

ProductsProductTypes

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

我不确定我在这里缺少什么简单的语法?

先谢谢。

1 个答案:

答案 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

请告诉我这是你所追求的。