2010-02-09 10 views
1

Voici une requête SQL que j'essaie de convertir en Linq. J'utilise une liste générique d'objets et non un DataTable si cela est pertinent.Requête SQL à Linq GroupBy et Max

Select Max(Date), ID, Property1, Peroperty2 From List Group By ID 

Veuillez nous aider.

Répondre

4

Bien que votre SQL est pas valide comme Property1 et Property2 doit faire partie de vos agrégats, ce groupera par ID, Propriété1, puis Propriété2 dans cet ordre qui est ce que je crois que vous recherchez:

from obj in List 
group obj by new {obj.ID, obj.Property1, obj.Property2 } into g 
select new 
     { 
      ID = g.Key.ID, 
      Property1 = g.Key.Property1, 
      Property2 = g.Key.Property2, 
      MaxDate = g.Max(p => p.Date) 
     } 

qui équivaut à:

Select Max(Date), ID, Property1, Peroperty2 
From List 
Group By ID, Property1, Property2 
+0

Merci Steve. Et désolé de la requête incorrecte. Mais tu m'as donné ce dont j'avais besoin. – Dave

1

Comme Steve dit, votre SQL n'est pas valide sans Propriété1 etc. dans la clause globale. Cependant, il me semble que vous essayez d'obtenir les données pour ces «lignes» où la date est égale à la date maximale pour le groupe de «lignes» par Id?

Cela fonctionne comme ça:

recs.GroupBy(r => r.Id).SelectMany(g => g.Where(r => r.Date == g.Max(a => a.Date))) 

Groupes par Id, obtient un IEnumeration des éléments dont la date correspond à la date maximum pour ce groupe, et les aplatit en une seule IEnumeration - qui peut alors être itéré ou tout ce que vous voulez.

Edit: Par ailleurs, dans la requête syntaxe du mieux que je peux faire (m'a pris un certain temps ...) est quelque chose comme:

from r in recs 
where r.Date == 
    (from sr in recs 
    where sr.Id == r.Id 
    select sr.Date).Max() 
select r; 

Edit 2:

Ce qui est en fait plus :

recs.Where(r => r.Date == recs.Where(sr => sr.Id == r.Id).Max(a => a.Date)).Select(r => r) 

dans la syntaxe couramment, ce qui ne semble pas aussi agréable pour moi que la première façon que je l'ai fait ... Je ne aime pas vraiment la syntaxe d'expression de requête, ce qui est drôle parce que je suis à l'aise avec SQL et la syntaxe de requête est censée être plus comme SQL.