"Najpopularniejsza" grupa w LINQ?

Zakładając tabelę tagów takich jak znaczniki pytań stoskoverflow:

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

Jaki jest najskuteczniejszy sposób na uzyskanie 25 najczęściej używanych tagów za pomocą LINQ? W SQL, prosta grupa przez zrobi:

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

Napisałem jakiś LINQ który działa:

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);
Naprawdę? Czy to nie jest mega gadatliwe? Smutne jest to, że robię to, aby zapisać ogromną liczbę zapytań, ponieważ moje obiekty znaczników zawierają już Częstotliwość właściwość, która w przeciwnym razie musiałaby sprawdzić z powrotem w bazie danych dla każdego znacznika, jeśli faktycznie użyłem właściwości.

Więc następnie parsuję te anonimowe typy z powrotem do obiektów tagów:

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));
Jestem nowicjuszem LINQ, a to nie wydaje się w porządku. Proszę, Pokaż mi, jak to się naprawdę robi.
Author: ekad, 2008-10-30

4 answers

Jestem prawie pewien, że masz rację. I, SQL, który LINQ generuje i wysyła do twojego db będzie wyglądał tak samo jak SQL, z którym zacząłeś, więc podczas gdy robisz trochę więcej wpisywania, twoja baza danych nie robi więcej pracy.

 10
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 16:59:04

Jeśli chcesz tagować obiekty, dlaczego nie utworzyć ich bezpośrednio z zapytania Linq?

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

return groups.OrderByDescending(g => g.Frequency).Take(25);
 24
Author: GalacticCowboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 16:53:14

Jeśli używasz wyrazistej formy składni, Twój kod będzie wyrazisty. Oto alternatywa:

List<Tag> result = 
  db.Tags
  .GroupBy(t => t.Tag)
  .Select(g => new {Tag = g.Key, Frequency = g.Count()})
  .OrderByDescending(t => t.Frequency)
  .Take(25)
  .ToList()
  .Select(t => new Tag(){Tag = t.Tag, Frequency = t.Frequency})
  .ToList();
 12
Author: Amy B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 18:21:55

Myślę, że jesteś również niesprawiedliwy, ponieważ twoje zapytanie SQL nie robi tego samego co zapytanie LINQ - nie zwraca top 25.

 3
Author: NetMage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-20 20:18:32