2010-03-22 10 views
5

Ich habe eine einfache SQL-Abfrage:Zählen Aufzeichnungen in C# LINQ mit

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units 
FROM tbl_Results 
GROUP BY ID, OptionName 

Die Ergebnisse I Were bekam:

'1' '4' 'Approved' '40' 
'2' '1' 'Rejected' '19' 
'3' '2' 'Not Decided' '12' 

ich die Daten in der Datenbank zu verschlüsseln, und als solche Uhr nicht in der Lage, die Daten in relationaler Form zu summieren. Um das zu umgehen, entschlüssle ich die Daten in der Anwendungsschicht und möchte sie dort mit LINQ abfragen. Ich brauche die folgenden Ergebnisse:

'1' 'Approved'  '10' 
'3' 'Not Deceided' '6' 
'2' 'Rejected'  '19' 
'1' 'Approved'  '15' 
'1' 'Approved'  '5' 
'3' 'Not Deceided' '6' 
'1' 'Approved'  '10' 

ich diese Ergebnisse in der Klasse setzen und eine stark typisierte Liste erstellen:

public class results 
{ 
public int ID {get;set;} 
public string OptionName {get;set;} 
public int Unit {get;set;} 
} 

ich fast die LINQ-Abfrage habe über die Ergebnisse wie die SQL-Abfrage zu bringen:

var q = from r in Results 
     group p.Unit by p.ID 
     int g 
     select new {ID = g.Key, 
        Selections = g.Count(), 
        Units = g.Sum()}; 

Wie stelle ich sicher, dass meine LINQ-Abfrage auch geben Sie mir die Option Name?

Wenn ich eine Klasse namens Statistics erstellt habe, um meine Ergebnisse zu speichern, wie würde ich die LINQ-Abfrage ändern, um mir List<Statistics> Ergebnismenge zu geben? so

public class results 
    { 
    public int ID {get;set;} 
    public int NumberOfSelections { get; set; } 
    public string OptionName {get;set;} 
    public int UnitTotal {get;set;} 
    } 

Antwort

4

Sie sind momentan nur Gruppierung durch die ID. Stattdessen müssen Sie gemäß der ursprünglichen Abfrage auch nach dem Optionsnamen gruppieren. Auf diese Weise enthält der Schlüssel jeder Gruppe sowohl die ID als auch den Optionsnamen. Hier ist nur, dass Wandel:

var q = from r in Results 
     group r.Unit by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum() }; 

Nun, es war nicht sofort offensichtlich für mich, dass Sie nur die „Einheit“ Teil der Datengruppe wurden ausgewählt wird. Ich habe "Gruppe p.Unit von" im Abfrageausdruck vermisst. Meine schlechte ... aber andere mögen es auch tun. Hier ist eine Alternative, die die Gruppe die Elemente enthalten, macht und summiert dann die Einheiten in der Projektion:

var q = from r in Results 
     group r by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum(x => x.Unit) }; 
+0

Ich bin froh, dass ich zu lange gebraucht habe, um zu antworten. Ich wollte etwas wie "Gruppenergebnis nach Ergebnis.ID" vorschlagen und dann "OptionsName = g.Select (result => result.OptionName) .First()". Was wahrscheinlich zu viel wäre. –

1

Diese Abfrage Gruppen von id und Optionsnamen verfügbar zu machen:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      Selections = g.Count(), 
      Units = g.Sum() 
     }; 

Um Ihre benutzerdefinierten Ergebnisklasse Verwendung zurück:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new results() { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      NumberOfSelections = g.Count(), 
      UnitTotal = g.Sum() 
     }; 
+1

Sie brauchen keine Namen für Eigenschaften in einem anonymen Typ angeben, ob der Ausdruck verwendet abzurufen der Wert schon passend - siehe meine Antwort für ein Beispiel. –