LINQ to SQL:GroupBy()和Max()获取具有最新日期的对象
考虑一个用于存储审核事件的SQL Server表。
需要只获得每个CustID的最新条目 。 我们想要获得整个对象/行。 我假设在查询中需要GroupBy()。 这是迄今为止的查询:
var custsLastAccess = db.CustAccesses .Where(c.AccessReason.Length>0) .GroupBy(c => c.CustID) // .Select() .ToList(); // (?) where to put the c.Max(cu=>cu.AccessDate)
问题:如何创建查询以为每个CustID
选择最新(最大AccessDate
)记录/对象?
我想知道是否有类似的东西:
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();
你也可以试试OrderBy()
和Last()
使用LINQ语法,我觉得它看起来更干净:
var custsLastAccess = from c in db.CustAccesses group c by c.CustID into grp select grp.OrderByDescending(c => c.AccessDate).FirstOrDefault();
这里:这使用max而不是OrderByDesc,所以应该更有效率。
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;
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();
- 如何在where和between子句中查询DBF(dbase)文件的日期类型字段
- AES-Encrypt-then-MAC一个带.NET的大文件
- webbrowser控制与内存增加问题
- 如何使用qbxml和qbsdk13修改quickbooks中的发票?
- 是否可以覆盖MultipartFormDataStreamProvider,以便不上传到文件系统?
- 如何在JIRA中使用REST api创建问题?
- System.BadImageFormatException:尝试使用installutil.exe安装服务时无法加载文件或程序集…格式不正确
- 找不到类型或命名空间名称“OpenIddictDbContext ”
- 在C#上的Windows Phone 8.1上向人员添加联系人