2012-02-15 12 views
5

Please help me convertire questo per un'espressione lambdaLINQ to SQL GroupBy Max() lambda

SELECT [UserID], MAX(Created) Created 
FROM [UserHistory] 
WHERE userid IN (14287) 
GROUP BY [UserID] 

Grazie!

MODIFICA: Ecco quello che ho finora.

List<T> list; //list is populated 

table.Where(x => list.Select(y => y.ClientId).Contains(x.UserID)) 
        .GroupBy(x => x.UserID) 
        .Select(x => new { x.UserID, x.Created }) 
        .ToList(); 

Quando aggiungo il GroupBy, il mio Select dice che non c'è definizione per x.UserID e x.Created.

+3

A cosa sei bloccato? – Krizz

+0

Quando aggiungo il gruppo per, la mia selezione si interrompe. Il gruppo elimina tutti gli altri campi o qualcosa del genere? – Kukoy

+1

Ricorda che dopo 'raggruppa per' hai 'IEnumerable >' invece del tuo originale 'IEnumerable '. I ragazzi qui sotto mostrano esempi pratici del fatto. – Krizz

risposta

11

Qui si va:

var userIDs = new[] {14287, }; 

var results = 
dataContext.UserHistories 
.Where(user => userIDs.Contains(user.userID)) 
.GroupBy(user => user.userID) 
.Select(
    userGroup => 
     new 
     { 
      UserID = userGroup.Key, 
      Created = userGroup.Max(user => user.Created), 
     }); 
+0

Perfetto, grazie. – Kukoy

0
var query = from history in context.UserHistories 
       where (new[] {14287}).Contains(history.userID) 
       group history by history.UserID into g 
      select new 
      { 
       UserId = g.Key, 
       MaxCreated = g.Max(x => x.Created) 
      }; 
+0

Hai perso la frase 'WHERE userid IN (14287)'. – Krizz

+0

Giusto. Grazie per la nota. – Meligy

+0

Il post originale chiedeva lambda – jgerman

0

Per quanto riguarda la tua modifica, come ho detto in commento, in .Select(x => new { x.UserID, x.Created }), x è non è più un UserHistory, è IGrouping<int, UserHistory> (1), che non avere proprietà UserID e Created, ma solo proprietà Key, che è un ID utente e implementa IEnumerable per enumerare tutti gli elementi per la chiave specificata (id utente).

Utilizzare lo snippet @DaveShaw poiché è il più corretto e più efficiente.

(1) Presumo UserID è int.