2016-08-05 11 views
0

Ich bin stecken diese SQL in Lambda Umschreiben:Umschreiben dieses SQL in Lambda - mit Zähl- und Gruppe von

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

Ergebnis:

+-----+---------------------------+----------+ 
|  |  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 | 
+-----+---------------------------+----------+ 

Und mein Code:

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

Es scheint nicht sehr schwierig, aber ich bin ein bisschen fest.

+0

Ist das SQL wirklich, was Sie wollen? Es sieht so aus, als ob Sie nach Zeitstempeln bis auf die Millisekunde gruppieren und ActivityDate dann nur auf den Datumsteil setzen. – Sconibulus

+0

@Sconibulus Ich interessiere mich nur für den Tag Teil des Datums, weil es eine Abfrage ist, wo ich Aktivität am Tag sehen möchte. –

+0

In diesem Fall möchten Sie wahrscheinlich das Datum und nicht den Zeitstempel auswählen und gruppieren. Beispiel: SELECT CAST (LoginDateTime AS DATE) – Sconibulus

Antwort

3

Methode Syntax:

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

Sie auch eine Überlastung von GroupBy, mit der Sie verwenden können, die select Funktion als zweiter Parameter

Abfragesyntax weitergeben müssen:

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

Nach GroupBy nur die Date Teil dieser DateTime tun: x.LoginDateTime.Date