Linq查询 - 为每个不同的列A

时间:2015-06-08 12:29:56

标签: c# asp.net-mvc linq entity-framework

我有一个名为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

1 个答案:

答案 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);

即可

演示代码:http://share.linqpad.net/9gxjcc.linq