开发者

Linq Grouping Question

开发者 https://www.devze.com 2023-02-13 10:53 出处:网络
I\'m trying to group by categories; let\'s say that I have two tables named as follows: Products, ProductTypes

I'm trying to group by categories;

let's say that I have two tables named as follows:

Products, ProductTypes

var foo = (from products in context.PRODUCTS
   join producttype in context.PRODUCTTYP开发者_运维问答E
   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()
   });

Here's sample data

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

my results are as follows

CategoryA 1
CategoryA 1
CategoryB 1
CategoryC 1

I'm expecting the results to be

CategoryA 2
CategoryB 1
CategoryC 1

This is correct, except CategoryA should show up as CategoryA 2.

I'm not sure what simple syntax I'm missing here?

Thanks in Advance.


You are currently grouping by a composite key (name, producttypeid, productid) - any unique combination of these will show up as a separate group. It sounds like you want to group by just producttypeid.

Edit:

First of all your LINQ query seems to be missing a part (the join criteria), it should be more like this to even compile:

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();

Your composite key (Name, ProductTypeId, ProductId) defines the unique elements by which your data will be grouped by. Looking at the sample data you provided you can quickly see that there are four unique combinations:

(Name, ProductTypeId, ProductId) 
(CategoryA, 1, 1)
(CategoryA, 2, 1)
(CategoryB, 3, 2)
(CategoryC, 4, 3)

That's why you have the output you provided:

 (Name, ProductId) 
    CategoryA 1
    CategoryA 1
    CategoryB 1
    CategoryC 1

To get the groups you do want to have, a regular Linq group join would do (names normalized to camel case):

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);
}

Output:

CategoryA : 2
CategoryB : 1
CategoryC : 1

Let me know if this is what you were after.

0

精彩评论

暂无评论...
验证码 换一张
取 消