2013-10-10 15 views
16

Ich versuche, die folgende Abfrage zu übersetzen:Gruppe von Graf und Lambda Expression

SELECT STATE, COUNT(*) 
FROM MYTABLE 
GROUP BY STATE; 

in einem Lambda-Ausdruck. Ich benutze C# und EntityFramework, aber es scheint nicht, dass ich es funktionieren lassen kann. Hier ist, was ich auf meinem respository haben bisher:

public IEnumerable<object> PorcentajeState(Guid id) 
{ 
    return _context.Sates.Where(a => a.Id == id) 
         .GroupBy(a => a.State) 
         .Select(n => new { n.StateId , n.Count() }); 
} 

Natürlich ist es kompilieren tut und ich bin verloren nach 2 Stunden googeln. Kannst du mir bitte Helfen?

Dank im Voraus

+1

Können Sie bitte den Compilerfehler, den Sie bekommen, angeben? –

Antwort

36

Es gibt zwei Probleme hier:

  1. Das Ergebnis GroupBy wird wird eine zählbare von IEnumerable<IGrouping<TKey, TSource>> Typ sein. Die Schnittstelle IGrouping verfügt nur über eine Eigenschaft, auf die Sie zugreifen können, Key. Dies ist der Schlüssel, den Sie im Ausdruck GroupBy angegeben haben, und implementiert IEnumerable<T>, damit Sie andere Linq-Operationen am Ergebnis ausführen können.
  2. Sie müssen einen Eigenschaftsnamen für den anonymen Typ angeben, wenn er nicht aus einem Eigenschaften- oder Feldausdruck abgeleitet werden kann. In diesem Fall rufen Sie Count auf der IGrouping, so dass Sie einen Namen für diese Eigenschaft angeben müssen.

Try this:

public IEnumerable<object> PorcentajeState(Guid id) 
{ 
    return _context.Sates.Where(a => a.Id == id) 
         .GroupBy(a => a.StateId) 
         .Select(g => new { g.Key, Count = g.Count() }); 
} 

Das Äquivalent in Abfragesyntax

public IEnumerable<object> PorcentajeState(Guid id) 
{ 
    return from a in _context.Sates 
      where a.Id == id 
      group a by a.StateId into g 
      select new { a.Key, Count = g.Count() }; 
} 

In jedem Fall wäre, wenn Sie die erste Eigenschaft wollen StateId statt Key, gerade Änderung genannt werden das zu

new { StateId = g.Key, Count = g.Count() } 
+0

Danke! Also wäre es g.Key.Field (In meinem Fall STATE). Richtig? – N8K8

+0

@ user2865100 Ich bin ein wenig verwirrt, ob Sie nach 'State' oder' StateId' gruppieren möchten. Sollen sie das gleiche Feld sein (nur ein Tippfehler)? Wenn nicht, wie stehen sie zueinander? –

+0

Ich maskierte es eigentlich ein bisschen von meinem ursprünglichen Code, also höchstwahrscheinlich ein Tippfehler. Das tut mir leid. State ist eine Beschreibung, ich muss die Anzahl jeder Beschreibung für alle diejenigen, die die Where-Klausel entsprechen. Ich brauche das, um ein PieChart mit diesem Feed zu "füttern": http://blog.platformular.com/2012/03/20/load-google-chart-by-ajax-using-asp-net-mvc-and- jquery /. Dieser Code befindet sich in meinem Repository und kompiliert jetzt mit Ihrer Hilfe. Vielen Dank! Ich bin jetzt auf Controller fest, aber ich muss es jetzt ansehen, dass ich das behoben habe. – N8K8

1

Dieser ist gut

public IEnumerable<object> PorcentajeState(Guid id) 
    { 
     return _context.Sates.Where(a => a.Id == id) 
          .GroupBy(a => a.StateId) 
          .Select(g => new { g.Key, Count = g.Count() }); 
    } 

Aber versuchen Sie es.

public IEnumerable<object> PorcentajeState(Guid id) 
     { 
      return _context.Sates.Where(a => a.Id == id) 
           .GroupBy(a => a.StateId) 
           .Select(g => new { g.Key.StateId, Count = g.Count() }); 
     } 
Verwandte Themen