Pergunta

Assumindo uma tabela de marcas como a pergunta stackoverflow tags:

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

O que é a forma mais eficiente de obter as 25 marcas mais usados ??usando o LINQ? Em SQL, um simples GROUP BY vai fazer:

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

Eu escrevi alguns LINQ que as obras:

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

Como, realmente? Não é este mega-detalhado? O triste é que eu estou fazendo isso para salvar um grande número de consultas, como o meu Tag já objetos contêm uma propriedade Frequência que de outra forma precisa verificar novamente com o banco de dados para cada Tag se eu realmente usou a propriedade.

Então, eu então analisar esses tipos anônimos volta em objetos etiqueta:

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

Eu sou um novato LINQ, e isso não parece certo. Por favor me mostrar como é realmente feito.

Foi útil?

Solução

Eu tenho certeza que você tem direito. E, o SQL que LINQ gera e envia para o seu db vai olhar apenas como o SQL que você começou com, por isso, enquanto você está fazendo um pouco mais de digitação, seu banco de dados não está fazendo mais trabalho.

Outras dicas

Se você quiser objetos Tag, porque não criar-los diretamente de sua consulta 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);

Se você usar o formulário detalhado da sintaxe, o seu código será detalhado. Aqui está uma alternativa:

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

Eu acho que você é também ser injusto em que sua consulta SQL não faz a mesma coisa que sua consulta LINQ - ele não retorna o top 25

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top