【问题标题】:LINQ Count and Max togetherLINQ 计数和最大值一起
【发布时间】:2017-09-29 02:05:29
【问题描述】:

以下 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

【问题讨论】:

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


    【解决方案1】:

    使用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)
                                                     });
    

    【讨论】:

    • 您建议的解决方案是显示每个日期的总登录次数。我在原始帖子中添加了一个 UPDATE 部分,其中包含一个示例,该示例显示我们需要用户的 all 登录总数以及用户上次登录的时间。T-sql 查询正确显示此摘要,但 LINQ 不显示。也许,我原来的帖子没有一个例子不清楚。
    • 每个日期?我没有按日期分组,values 是按用户名分组的 login_story 实体,换句话说,它是每个用户名的所有登录故事的集合,Max 方法返回一个值,我不明白这是怎么回事正在发生
    • 那我可能显示错了。我将List<LHCountsViewModel> lstLH = _context.login_history.OrderBy(u => u.UserName).GroupBy(u => u.UserName, (key, values) => new LHCountsViewModel { user_name = key, count = values.Count(), last_login = values.Max(e => e.LoginDate) }).ToList(); 返回到具有@model List<MyProj.Models.LHCountsViewModel> 和@foreach (var item in Model) {....} 循环的视图
    【解决方案2】:

    试试这个:

    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)
                      };
    

    【讨论】:

    • 您建议的解决方案是显示每个日期的总登录次数。请在下方查看我对@octavioccl 的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多