2011-02-24 49 views
1

我试图通过组类别;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

我不知道有什么简单的语法,我在这里失踪?

在此先感谢。

+0

你们为何products.productid加入? Products表中是否有多个productID? – Thea 2011-02-24 18:58:57

+0

我通过productid加入到其他需要过滤初始结果(活动状态,价格等)的表格中。 Products表中不超过1个productID。 – dave2118 2011-02-24 19:52:18

+0

所以,你应该从小组陈述 – Thea 2011-02-25 12:57:17

回答

1

您目前是按一个组合键(名字,producttypeid,产品ID)分组 - 这些任何独特的组合将显示为一个单独的组。这听起来像是你想通过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 

让我知道这是你所追求的。

+0

@BrokenGlass所有这三个的都应该是唯一将其删除。如果我只通过producttypeid进行分组,我该如何解决其他人的价值观? – dave2118 2011-02-24 19:01:24

+0

@ dave2118:问题似乎是产品类型'CategoryA'中有两种产品,每种都有不同的产品ID,因此每种产品都显示在不同的组中。你想让他们在同一个团队中,你不是吗? – BrokenGlass 2011-02-24 19:27:56

+0

@BrokenGlass正确,productID不同,但它是我需要过滤的prodcuttypeid。 – dave2118 2011-02-24 19:43:20