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