我有一个名为Visits的数据库表,有三列; ContactId,DateOfContact和LocationId。
表格的每一行代表在某个LocationId登录的联系人,而DateOfContact时间戳代表他们登录的时间。
我想查询该表以查找过去24小时内每个ContactId最近的两个访问实例,即他们最近登录的两个记录。
如果他们在过去24小时内只有一个访问记录,则该列表仍应包含该单个记录。
所以我目前只选择最近24小时内每个联系人的最新访问记录,如下所示:
var result = _context.Visits
.Where(d => LocIds.Contains(d.LocationId) && DateOfContact >= DateTime.Now.AddDays(-1))
.GroupBy(d => d.ContactId)
.OrderBy(g => g.Max(d => d.DateOfContact))
.Select(d => new { d.FirstOrDefault().ContactId, d.FirstOrDefault().DateOfContact }).ToList();
我希望最后两次访问。
像这样的东西
的ContactID。 。 。 。 。 DateOfContact
1。 。 。 。 。 。 。 。 。 。 。 08/06/2015 13:11:00
1。 。 。 。 。 。 。 。 。 。 。 08/06/2015 12:11:00
2。 。 。 。 。 。 。 。 。 。 。 08/06/2015 11:11:00
2。 。 。 。 。 。 。 。 。 。 。 08/06/2015 10:11:00
3。 。 。 。 。 。 。 。 。 。 。 08/06/2015 09:11:00
4。 。 。 。 。 。 。 。 。 。 。 08/06/2015 08:11:00
4。 。 。 。 。 。 。 。 。 。 。 08/06/2015 07:11:00
在列表中。
我能实现吗?我尝试实现Take(2),但无法真正实现它。
谢谢, JK
答案 0 :(得分:3)
Take()
应该这样做:
var result = source.Where(x => x.DateOfContact >= DateTime.Now.AddDays(-1))
.GroupBy (x => x.ContactId)
.OrderBy(g => g.Max(d => d.DateOfContact))
.Select(x => x.Take(2));
如果要展平列表,只需附加.SelectMany(x => x);