Pregunta

Suponiendo una tabla de etiquetas como las etiquetas de pregunta de stackoverflow:

  

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

¿Cuál es la forma más eficiente de obtener las 25 etiquetas más utilizadas utilizando LINQ? En SQL, un simple GROUP BY hará:

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

He escrito algunos LINQ que funcionan:

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, de verdad? ¿No es esto mega-verboso? Lo triste es que estoy haciendo esto para guardar una gran cantidad de consultas, ya que mis objetos de Etiqueta ya contienen una propiedad de Frecuencia que de otra manera necesitaría consultar con la base de datos para cada Etiqueta si realmente usé la propiedad.

Entonces, luego analizo estos tipos anónimos atrás en los objetos Tag:

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

Soy un novato de LINQ, y esto no parece correcto. Por favor, muéstrame cómo se hace realmente.

¿Fue útil?

Solución

Estoy bastante seguro de que lo has entendido bien. Y, el SQL que LINQ genera y enviará a su base de datos tendrá el mismo aspecto que el SQL con el que comenzó, así que mientras está escribiendo un poco más, su base de datos no estará haciendo más trabajo.

Otros consejos

Si desea etiquetar objetos, ¿por qué no los crea directamente desde su 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);

Si usa la forma detallada de la sintaxis, su código será detallado. Aquí hay una 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();

Creo que también eres injusto en el sentido de que tu consulta SQL no hace lo mismo que tu consulta LINQ, no devuelve los 25 primeros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top