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)
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