Question

En supposant une table de balises comme les balises de question stackoverflow:

  

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

Quel est le moyen le plus efficace d’obtenir les 25 balises les plus utilisées avec LINQ? En SQL, un simple GROUP BY fera:

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

J'ai écrit un LINQ qui fonctionne:

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

Comme, vraiment? N'est-ce pas méga-verbeux? Ce qui est triste, c’est que je fais cela pour enregistrer un grand nombre de requêtes, car mes objets Tag contiennent déjà une propriété Frequency qui devrait sinon vérifier la base de données pour chaque Tag si j’utilisais réellement la propriété.

J'ai donc analysé ces types anonymes back en objets Tag:

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

Je suis un novice LINQ et cela ne semble pas bien. S'il vous plaît, montrez-moi comment c'est vraiment fait.

Était-ce utile?

La solution

Je suis sûr que vous avez tout compris. Et le SQL que LINQ génère et envoie à votre base de données ressemblera au SQL avec lequel vous avez commencé. Ainsi, même si vous tapez un peu plus, votre base de données ne fonctionne plus.

Autres conseils

Si vous voulez des objets Tag, pourquoi ne pas les créer directement à partir de votre requête 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);

Si vous utilisez la forme verbeuse de la syntaxe, votre code sera détaillé. Voici une 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();

Je pense que vous êtes également injuste en ce que votre requête SQL ne fait pas la même chose que votre requête LINQ - elle ne renvoie pas le top 25.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top