【问题标题】:Recent users query最近用户查询
【发布时间】:2012-12-27 20:55:46
【问题描述】:

我有 2 个表,例如让我们假设这是数据:

用户表:

 ------------------------------
|   user_id     |   username    |
 ------------------------------
| 1             | danny         |
| 2             | george        |
| 3             | lana          |
| 4             | kim           |
| 5             | tim           |
 ------------------------------

users_logins 表:

     -----------------------------------------------
    | record_id | user_id   |   recorder            |
     -----------------------------------------------
    | 1         | 3         | 2012-11-06 04:18:26   |
    | 2         | 3         | 2012-11-06 04:31:05   |
    | 3         | 2         | 2012-11-06 03:44:22   |
    | 4         | 1         | 2012-11-06 04:18:58   |
    | 5         | 1         | 2012-11-06 04:30:15   |
    | 6         | 3         | 2012-11-06 04:31:05   |   X
    | 7         | 1         | 2012-11-06 05:53:47   |
    | 8         | 1         | 2012-11-06 05:55:15   |   X
    | 9         | 4         | 2012-11-06 05:59:31   |
    | 10        | 4         | 2012-11-06 06:12:55   |   X
     -----------------------------------------------

我想显示 3 个最近登录的用户,因此结果将只显示对他们有 X 标记的行,或者说是唯一的最近登录。

查询会是什么样子?

【问题讨论】:

    标签: c# .net linq join linq-to-objects


    【解决方案1】:

    对 linq to objects 试试这个

     (from login in users_logins.OrderByDescending(user => user.recorder) 
     from user in users
     where user.user_id == login.user_id
     select user).Distinct().Take(3)
    

    此查询
    1. 先按日期排序
    2.然后将排序后的登录数据与用户数据连接起来,
    3. 然后获取不同的用户
    4. 然后最后取前 3 条记录。


    以下是替代查询

    from login in users_logins.OrderByDescending(user =>user.recorder).GroupBy(user=>user.recorder).SelectMany( users=>users.First()).Take(3) 
    from user in users
    where user.user_id == login.user_id
    select user
    

    此查询
    1. 第一类
    2. 然后在 user_id 上分组
    3. 然后取前 3 条不同用户 ID 的记录,
    4. 然后加入用户数据。

    【讨论】:

      【解决方案2】:

      我想这就是你想要的。

      var resentLogedInUsers =
          users
              .Join(
                  users_logins,
                  u => u.user_id,
                  l => l.user_id,
                  (u, l) => new
                                  {
                                      User = u,
                                      Login = l.recorder
                                  })
              .GroupBy(j => j.User)
              .Select(l => new {User = l.Key, LastLogin = l.Max(d => d.Login)})
              .OrderByDescending(r => r.LastLogin)
              .Take(3);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-28
        • 2016-04-19
        • 1970-01-01
        • 2015-05-17
        • 2011-12-22
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多