LINQ计数和最大值

时间:2017-05-01 16:42:01

标签: c# linq tsql sql-server-2012 entity-framework-core

以下SQL Server查询返回用户成功登录的总数和上次登录(日期类型)。这个查询的LINQ等价物是什么?

SELECT username, COUNT(LoginDate) AS total,
MAX(LoginDate) AS last_login
FROM login_history
GROUP BY username

无法计算出以下内容中的last_login值:

var query = _context.login_history.GroupBy(u => u.userName, (key, values) => new { user_name = key, count = values.Count(), last_login = ???? });

更新

例如,每次用户登录他/她的记录时都会添加如下内容。请注意,命中列只是一个计数器,为每个登录记录添加1。在下面的示例中,jsmith到目前为止共记录了5次,而他上一次登录的时间是7/24/2016 9:16。下面第二个表中显示的T-Sql查询结果反映了jsmith的总登录次数和上次登录日期:

UserName Login_hit  LoginDate
jsmith  1   7/20/2016 13:37
jsmith  1   7/19/2016 10:40
jsmith  1   7/24/2016 9:16
jsmith  1   7/19/2016 9:16
jsmith  1   7/15/2016 14:55
bdoe    1   7/15/2016 14:55
....

SQL Server中SQL查询的结果:

UserName |Total Logins | LasLoginDate
jsmith   |  5          |  7/24/2016 9:16
bdoe     |  79         |  7/12/2016 14:41
talbert  |  23         |  7/8/2016 22:51
bdole    |  87         |  7/21/2016 17:56
mdukakus |  31         |  7/22/2016 9:01

2 个答案:

答案 0 :(得分:3)

使用Max扩展方法:

var query = _context.login_history
                    .GroupBy(u => u.userName, 
                            (key, values) => new { user_name = key,
                                                   count = values.Count(),
                                                   last_login = values.Max(e=>e.LoginDate)
                                                 });

答案 1 :(得分:1)

试试这个:

var query = from lh in login_history
            group lh by new
                  {
                    user_name = lh.user_name
                  } into g
                  select new {
                    user_name = g.Key.user_name,
                    count = g.Count(),
                    last_login = g.Max(l => l.LoginDate)
                  };