"Most popular" GROUP BY in LINQ?

Posted by tags2k on Stack Overflow See other posts from Stack Overflow or by tags2k
Published on 2008-10-30T16:41:43Z Indexed on 2010/05/20 20:20 UTC
Read the original article Hit count: 233

Filed under:
|
|
|
|

Assuming a table of tags like the stackoverflow question tags:

TagID (bigint), QuestionID (bigint), Tag (varchar)

What is the most efficient way to get the 25 most used tags using LINQ? In SQL, a simple GROUP BY will do:

SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag

I've written some LINQ that works:

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new { Tag = g.Key, Frequency = g.Count() };
return groups.OrderByDescending(g => g.Frequency).Take(25);

Like, really? Isn't this mega-verbose? The sad thing is that I'm doing this to save a massive number of queries, as my Tag objects already contain a Frequency property that would otherwise need to check back with the database for every Tag if I actually used the property.

So I then parse these anonymous types back into Tag objects:

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));

I'm a LINQ newbie, and this doesn't seem right. Please show me how it's really done.

© Stack Overflow or respective owner

Related posts about LINQ

Related posts about groups