Frage

eine Tabelle von Tags wie die Stackoverflow Frage Tags Unter der Annahme:

  

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

Was ist der effizienteste Weg, um die 25 am häufigsten verwendeten Tags mithilfe von LINQ zu bekommen? In SQL wird eine einfache GROUP BY tun:

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

Ich habe einige LINQ geschrieben, das funktioniert:

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

Wie, wirklich? Ist das nicht mega-ausführliche? Das Traurige daran ist, dass ich das tue eine massive Anzahl von Abfragen zu speichern, da mein Tag Objekte bereits eine Frequenz-Eigenschaft enthalten, die sonst benötigen würden mit der Datenbank für jeden Tag zu prüfen, ob ich tatsächlich verwenden die Eigenschaft.

Also habe ich dann diese anonyme Typen analysieren zurück in Tag-Objekte:

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

Ich bin ein LINQ Neuling, und dies scheint nicht richtig. Bitte zeigen Sie mir, wie es wirklich getan.

War es hilfreich?

Lösung

Ich bin mir ziemlich sicher, dass Sie es richtig haben. Und die SQL, die LINQ erzeugt und auf Ihre db aussehen senden genauso wie die SQL mit Ihnen gestartet, also, während Sie ein bisschen mehr Typisierung tun, Ihre Datenbank nicht tut mehr Arbeit.

Andere Tipps

Wenn Sie Tag Objekte wollen, warum sie nicht erstellt direkt aus Ihrer Linq Abfrage?

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

Wenn Sie die ausführliche Form der Syntax verwenden, wird Ihr Code umfangreich sein. Hier ist eine Alternative:

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

Ich glaube, Sie sind auch unfair sein, dass Ihre SQL-Abfrage das gleiche wie Ihre LINQ-Abfrage nicht tun - es nicht die Top-25 zurückkehren

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top