2009-03-03 5 views
5

Certaines requêtes LINQ me déroutent encore.Conversion de SQL contenant top, count, group et order en LINQ (2 entités)

Pour une table 'Hits' contenant deux colonnes, 'Page' et 'Date', je veux trouver le plus de pages avec le plus de lignes dans une tranche de temps définie.

Dans SQL j'utiliser ceci:

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 je suis arrivé aucune idée de la façon d'aborder cela, quelqu'un peut me aider ici? J'ai essayé de le convertir en utilisant linqer, mais cela montre juste une erreur pour cette expression.

Répondre

7

Quelque chose comme cela devrait fonctionner:

(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

Typo en p < maxDate -> p.Date Sam

+0

Oh, et, bien sûr, si votre code LINQ est utilisé dans C# aurait à utilisez '&&' au lieu de 'et'. Dunno comment il devrait être 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

Typo in .Select (g => Page = g.Key, Number = g.Count()}) -> .Sélectionnez (g => new {Page = g.Key, Number = g.Count()} Sinon "même chose .. mais différent" :) – veggerby

+0

Merci pour l'avis de faute de frappe - veggerby; et le contrôle - Justice. –

+0

Aussi - @ "same same ... but different" Je trouve que les méthodes d'extension sont plus détectables que la syntaxe de compréhension de la requête. C'est ce que j'utilise. –