2009-03-10 14 views
4

Ich möchte eine Linq zu Sql-Abfrage, die eine Zählung und Gruppen von einem Benutzernamen und DateTime. Ich möchte die DateTime wie folgt "YYYY-MMM" (d. H. 2009-Mar) formatiert werden.Linq zu Sql - DateTime Format - JJJJ-MMM (2009-Mar)

Ich dachte, das würde funktionieren, aber Linq to Sql kann das ToString "Format" -Argument nicht analysieren.

  dc.MyTable 
       .GroupBy(r => new 
       { 
        Name = r.UserName, 
        YearMonth = r.SomeDateTime.ToString("yyyy-MMM") 
       }) 
       .Select(r => new 
       { 
        Name = r.UserName, 
        YearMonth = r.YearMonth, 
        Count = r.Count() 
       }) 
       .OrderBy(r => r.YearMonth) 
       .ThenBy(r => r.Name); 

Hat jemand irgendwelche Gedanken/Vorschläge?

Danke.

+0

Übrigens - wenn Sie möchten, können Sie dies tatsächlich mit der Abfragesyntax schreiben und nicht mit dem fließenden/Erweiterungsansatz. Aber wenn Sie mit dem aktuellen Code zufrieden sind, lassen Sie ihn "wie er ist" ... –

+0

Ich bevorzuge tatsächlich die Erweiterung/Lambda-Syntax gegenüber der Abfragesyntax. Nur eine persönliche Vorliebe. – Chad

Antwort

5

Ich frage mich, wenn Sie nicht, dass die „lange“ Art und Weise tun sollten ...

  dc.MyTable 
      .GroupBy(r => new 
      { 
       Name = r.UserName, 
       Year = r.SomeDateTime.Year, 
       Month = r.SomeDateTime.Month 
      }) 
      .Select(r => new 
      { 
       Name = r.UserName, 
       Year = r.Year, 
       Month = r.Month, 
       Count = r.Count() 
      }) 
      .OrderBy(r => r.Year) 
      .ThenBy(r => r.Month) 
      .ThenBy(r => r.Name); 

Wenn Sie das Format als Zeichenfolge benötigen, tun, dass später bei der Benutzeroberfläche. Entweder durch Rekonstruieren eines DateTime usw. oder unter Verwendung von CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(...).

+0

Nicht die Antwort, die ich "wollte", aber ich denke, wahrscheinlich die korrekteste. Danke für den Hinweis auf DateTimeFormat.GetMonthName (...). – Chad

+0

Flüche, wieder vereitelt;) –

3

Ich würde vermeiden, alles in eine Zeichenfolge in der Datenbank zu verwandeln. Gruppieren Sie nach r.SomeDateTime.Year und r.SomeDateTime.Month, sortieren Sie nach Jahr, dann nach Monat und Namen, wählen Sie das Jahr und den Monat getrennt (zusammen mit der Zählung) und dann, wenn Sie die Projektion auf ein String-Format im Client-Code durchführen müssen.

By the way, ich vermute, Ihre zweite OrderBy ein ThenBy sein sollte - zur Zeit der Name ist eigentlich die meisten wichtige Sache, die Sie bei der Bestellung sind.

+0

Nun, du bist +71 bei mir heute - ich vermute, du wirst überleben; -p –