2010-11-01 7 views
4

Il est difficile de poser la question en anglais, donc je vais montrer ce que j'essaie de faire.Comment obtenir un groupe commandé par la colonne de compte

Voici mon code SQL:

select top 100 [Name], COUNT([Name]) as total from ActivityLog 
where [Timestamp] between '2010-10-28' and '2010-10-29 17:00' 
group by [Name] 
order by total desc 

je dois écrire que dans LINQ. Jusqu'à présent, je les suivantes:

var groups = from ActivityLog log in ctx.ActivityLog 
where log.Timestamp > dateFrom 
where log.Timestamp <= dateTo 
group log by log.Name; 

mais je n'ai pas la colonne pour trier COUNT(*) de :(

Répondre

3

diceguyd30's answer est techniquement et LINQ est correcte. En fait, la syntaxe de la requête est traduite dans les méthodes Queryable/Enumerable par le compilateur. Cela dit, ce qui manque, c'est d'utiliser le group ... by ... into syntax. La requête équivalente devrait être proche de celle-ci:

var query = from log in ctx.ActivityLog 
      where log.TimeStamp > dateFrom && log.TimeStamp <= dateTo 
      group log by log.Name into grouping 
      orderby grouping.Count() descending 
      select new { Name = grouping.Key, Total = grouping.Count() }; 

var result = query.Take(100); 

Notez que dans C# la méthode Take(100) n'a pas d'équivalent dans la syntaxe de requête vous devez donc utiliser la méthode d'extension. VB.NET, d'autre part, prend en charge Take et Skip dans la syntaxe de requête.

+0

Ahhhh .... J'ai appris quelque chose de nouveau aujourd'hui! +1 Merci, la syntaxe de requête n'est vraiment pas mon fort. – diceguyd30

+0

+1, moi aussi ... je ne connaissais pas le mot clé 'into' de la syntaxe groupby – sebagomez

5

Je crains que je suis beaucoup plus à l'aise avec la syntaxe couramment (par opposition à interroger syntaxe), mais voici une possible LINQ réponse:

ctx.ActivityLog 
    .Where(x => x.TimeStamp > dateFrom && x.TimeStamp <= dateTo) 
    .GroupBy(x => x.Name) 
    .Select(x => new { Name = x.Key, Total = x.Count() }) 
    .OrderByDescending(x => x.Total) 
    .Take(100) 

EDIT:

d'accord, je suis sorti de ma zone de confort et est venu avec une version de syntaxe de requête, ne vous attendez pas t beaucoup. Je vous avais prévenu de mes capacités ci-dessus:

(from y in (
    from x in (
     from log in ActivityLog 
     where log.Timestamp > dateFrom 
     where log.Timestamp <= dateTo 
     group log by log.Name) 
    select new { Name = x.Key, Total = x.Count() }) 
orderby y.Total descending 
select new { Name = y.Name, Total = y.Total }).Take(100) 
+0

+1, bonne astuce, merci ... Voyons si quelqu'un peut comprendre avec LinQ – sebagomez

+1

+1 pour la traduction correcte à LINQ. @sebastian c'est techniquement LINQ et la ** syntaxe de requête ** est compilée dans la ** syntaxe courante **. –

Questions connexes