LINQ à SQL: GroupBy () et Max () pour obtenir l'objet avec la dernière date

Considérons une table SQL Server utilisée pour stocker des événements à des fins d'audit.

, Le besoin est d'obtenir seulement dernière entrée pour chaque CustID. Nous voulons obtenir l'ensemble de l'objet / ligne. Je suppose qu'un GroupBy() sera nécessaire dans la requête. Voici la requête jusqu'à présent:

var custsLastAccess = db.CustAccesses   
                        .Where(c.AccessReason.Length>0)
                        .GroupBy(c => c.CustID)
//                      .Select()
                        .ToList();
// (?) where to put the c.Max(cu=>cu.AccessDate) 

Custs Mise En Page

Question: Comment puis-je créer la requête pour sélectionner le dernier enregistrement/objet (le maximum AccessDate) pour chaque CustID?

27
demandé sur p.campbell 2009-11-10 03:09:52

4 réponses

Je me demande si quelque chose comme:

var custsLastAccess = db.CustAccesses   
                    .Where(c.AccessReason.Length>0)
                    .GroupBy(c => c.CustID)
                    .Select(grp => new {
                      grp.Key,
                      LastAccess = grp.OrderByDescending(
                             x => x.AccessDate).FirstOrDefault()
                    }).ToList();

, Vous pouvez également essayer de OrderBy() et Last()

27
répondu Marc Gravell 2016-08-23 06:23:44

En utilisant la syntaxe LINQ, qui, je pense, semble plus propre:

var custsLastAccess = from c in db.CustAccesses 
                      group c by c.CustID into grp
                      select grp.OrderByDescending(c => c.AccessDate).FirstOrDefault();
19
répondu CodeGrue 2010-07-12 15:23:23

Ici: cela utilise max plutôt que OrderByDesc, donc devrait être plus efficace.

var subquery = from c in CustAccesses
            group c by c.CustID into g
            select new
            {
                CustID = g.Key,
                AccessDate = g.Max(a => a.AccessDate)
            };
var query = from c in CustAccesses
            join s in subquery 
              on c.CustID equals s.CustID
            where c.AccessDate == s.AccessDate
             && !string.IsNullOrEmpty(c.AccessReason)
            select c;
3
répondu Gary 2013-01-08 19:34:46
var custsLastAccess = db.CustAccesses   
                            .Where(c.AccessReason.Length>0)
                        .GroupBy(c => c.CustID, (id, custs) => new { ID=id, LastAccess=custs.OrderByDescending(c=>c.AccessDate).First().AccessDate})
                      .Select()
                        .ToList();
0
répondu vladhorby 2009-11-10 00:17:14