2009-03-03 14 views
5

Algunas consultas LINQ todavía me desconciertan.Conversión de SQL que contiene top, count, group y order a LINQ (2 entidades)

para una tabla 'Resultados' que contiene dos columnas, 'Página' y 'Fecha', quiero encontrar la mayor cantidad de páginas con la mayor cantidad de filas en un segmento de tiempo definido.

En SQL que usaría esto:

SELECT TOP 10 
     [Page] 
     ,COUNT([Page]) as Number 
FROM dbo.[Hits] 
WHERE [Date] >= CONVERT(datetime,'14 Jan 2009') 
AND [Date] < CONVERT(datetime,'15 Jan 2009') 
Group BY [Page] 
Order by Number DESC 

En LINQ No tengo idea de cómo abordar esto, alguien me puede ayudar aquí? Intenté convertirlo usando linqer, pero solo muestra un error para esta expresión.

Respuesta

7

Algo como esto debería funcionar:

(from p in DataContext.Hits 
where (p.Date >= minDate) && (p.Date < maxDate) 
group p by p.Page into g 
select new { Page = g.Key, Number = g.Count() }).OrderByDescending(x => x.Number).Take(10); 
+0

error tipográfico en p < maxDate -> p.Date Sam

+0

Ah, y, por supuesto, si su código de LINQ se utiliza en C# uno tendría que usa '&&' en lugar de 'y'. No sé cómo sería necesario estar en VB. – Sam

7
var top10hits = objectContext.Hits 
    .Where(h => minDate <= h.Date && h.Date < maxDate) 
    .GroupBy(h => h.Page) 
    .Select(g => new { Page = g.Key, Number = g.Count() }) 
    .OrderByDescending(x => x.Number) 
    .Take(10); 
+0

Error al escribir. Seleccionar (g => Página = g.Key, Number = g.Count()}) -> . Seleccionar (g => new {Página = g.Key, Number = g.Count()}) De lo contrario "lo mismo ... pero diferente" :) – veggerby

+0

Gracias por el aviso de error tipográfico - veggerby; y la edición - Justicia. –

+0

También - @ "Igual ... pero diferente" Encuentro que los métodos de extensión son más reconocibles que la sintaxis de comprensión de la consulta. Entonces eso es lo que uso. –