2016-08-05 17 views
0

我卡重寫這個SQL期λ:重寫這個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; 
} 

這似乎並不困難,但我有點卡住了。

+0

這是SQL真的是你想要的嗎?它看起來像按時間戳分組到毫秒,然後將ActivityDate設置爲只有日期部分。 – Sconibulus

+0

@Sconibulus我只關心日期的某一天,因爲這是一個查詢,我希望每天看到活動。 –

+0

在這種情況下,您可能希望選擇日期而不是時間戳。例如:SELECT CAST(LoginDateTime AS DATE) – Sconibulus

回答

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

GroupBy只是Date這部分DateTime做:x.LoginDateTime.Date