简体   繁体   English

LINQ查询按不同的类别/子类别计数

[英]LINQ Query to count by distinct category / subcategory

I have a table, generated from a LINQ query on a datatable, which has subcategory and category fields: 我有一个表,从一个数据表的LINQ查询生成,它有子类别和类别字段:

Name...........Category.........Subcategory  
Kiss...........Rock.............Glam Rock  
Metallica......Rock.............Hard Rock  
Bon Jovi.......Rock.............Soft Rock  
Slade..........Rock.............Glam Rock  
Meatloaf.......Rock.............Soft Rock  
Wilee..........Dance............Grime  
Mgmt...........Dance............Nu Rave  
Dizee..........Dance............Grime

The LINQ query I am using to generate this table is: 我用来生成这个表的LINQ查询是:

var qCategory = from c in dtCategory.AsEnumerable()
            select new {
                Artist = c.Field<string>("Artist"),
                Category = c.Field<string>("Category"),
                Subcategory = c.Field<string>("Subcategory")
             };

Now I want to get a count of each category/subcategory pair. 现在我想得到每个类别/子类别对的计数。 eg for the above example I want to return: 例如,对于上面的例子,我想返回:

Category............Subcategory.......Count  
Rock................Glam Rock.........2  
Rock................Soft  Rock........2   
Rock................Hard Rock.........1  
Dance...............Grime.............2  
Dance...............Nu Rave...........1

How can I acheive this? 我该如何实现这一目标?

Try: 尝试:

var counts = from artist in qCategory
             group artist by new { artist.Category, artist.Subcategory } 
                          into g
             select new { 
                           g.Key.Category,
                           g.Key.Subcategory, 
                           Count = g.Count() 
                        };

If you want to enforce that subcategories always have the same parent category (given that the sub-categories are named "Glam Rock" etc., I assume that this is in fact the case), do: 如果你想强制执行那些子类别总是有相同的父类别(假设子类别被命名为“Glam Rock”等,我认为这实际上就是这种情况),做:

var counts = from artist in qCategory
             group artist by artist.Subcategory into g
             select new {
                           Category = g.Select(a => a.Category)
                                       .Distinct()
                                       .Single(),
                           Subcategory = g.Key,
                           Count = g.Count()
                        };

This will throw an exception if "Rap Rock" turns up as a subcategory of both "Rap" and "Rock". 如果“Rap Rock”作为“Rap”和“Rock”的子类别出现,这将引发异常。

qCategory.
  GroupBy(item => new {Category = item.Category, Subcategory = item.Subcategory}).
  Select(group => new {Category = group.Key.Category, Subcategory = group.Key.Subcategory, Count = group.Count()})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM