在Lambda中重写此SQL - 使用count和group by

时间:2016-08-05 16:09:41

标签: c# sql linq lambda

我在Lambda中重写了这个SQL:

SELECT TOP 1000 COUNT(LoginDateTime)
      ,[LoginDateTime]
      ,[Culture]
  FROM [LearningApp].[dbo].[UserActivities]
  group by LoginDateTime, Culture

结果:

+-----+---------------------------+----------+
|     |      LoginDateTime        |  Culture |
+-----+---------------------------+----------+
|  1  |  2016-07-14 12:21:23.307  |    de    |
|  4  |  2016-07-13 12:21:23.307  |    en    |
|  2  |  2016-07-14 12:21:23.307  |    en    |
+-----+---------------------------+----------+

我的代码:

public List<UserActivityResponseContract> GetUserActivity()
{
    var userActivityResponseContracts = new List<UserActivityResponseContract>();

    var userActivitiesList = _baseCommands.GetAll<UserActivity>()
        .Select(x => new
        {
            x.LoginDateTime, 
            x.Culture
        })
        .GroupBy(x => new { x.LoginDateTime, x.Culture});

    foreach (var userActivity in userActivitiesList)
    {
        userActivityResponseContracts.Add(new UserActivityResponseContract
        {
            ActivityDate = userActivity.Key.LoginDateTime.ToShortDateString(),
            NumberOfTimesLoggedIn = userActivity.Count(),
            Culture = userActivity.Key.Culture
        });
    }
    return userActivityResponseContracts;
}

看起来并不困难,但我有点卡住了。

1 个答案:

答案 0 :(得分:3)

方法语法:

var result = _baseCommands.GetAll<UserActivity>()
                          .GroupBy(x => new { x.LoginDateTime, x.Culture})
                          .Select (x => new UserActivityResponseContract
                          { 
                              ActivityDate = x.Key.LoginDateTime.ToShortDateString(),
                              Culture = x.Key.Culture, 
                              NumberOfTimesLoggedIn = x.Count()
                          })
                          .Take(1000).ToList();

您还可以使用GroupBy重载,以便将select函数作为第二个参数传递

查询语法:

var result = (from x in _baseCommands.GetAll<UserActivity>()
              group x by new { x.LoginDateTime, x.Culture} into g
              select new UserActivityResponseContract
              { 
                 ActivityDate = g.Key.LoginDateTime.ToShortDateString(),
                 Culture = g.Key.Culture, 
                 NumberOfTimesLoggedIn = g.Count()
              }).Take(1000).ToList();

GroupByDate DateTime部分x.LoginDateTime.Date执行:{{1}}