2013-10-10 16 views
16

Próbuję tłumaczyć następujące zapytanie:Grupa przez hrabiego i Lambda Expression

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

Do wyrażenia lambda. Używam C# i EntityFramework, jednak nie wydaje mi się, żebym mógł to zrobić. Oto co mam na respository tej pory:

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

Oczywiście robi skompilować i jestem zgubiony po googlowania przez 2 godziny. Czy mógłbyś mi pomóc?

góry dzięki

+1

Czy możesz podać błąd kompilatora? –

Odpowiedz

36

Istnieją dwa problemy tutaj:

  1. Wynik GroupBy będzie będzie przeliczalna typu IEnumerable<IGrouping<TKey, TSource>>. Interfejs IGrouping ma tylko jedną właściwość, do której można uzyskać dostęp, Key, który jest kluczem określonym w wyrażeniu GroupBy i implementuje IEnumerable<T>, dzięki czemu można wykonywać inne operacje Linq na wyniku.
  2. Należy podać nazwę właściwości dla typu anonimowego, jeśli nie można jej wywnioskować z właściwości lub wyrażenia pola. W tym przypadku wywołujesz Count na IGrouping, więc musisz podać nazwę tej właściwości.

Spróbuj tego:

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

Równowartość w składni zapytania byłoby

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

W każdym razie, jeśli chcesz pierwszą nieruchomość być nazwany StateId zamiast Key, tylko zmiana to do

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

Dzięki! Tak więc byłby to g.Key.Field (w moim przypadku STATE). Poprawny? – N8K8

+0

@ user2865100 Jestem trochę zdezorientowany, czy chcesz grupować według 'State' lub' StateId'. Czy mają być tym samym polem (tylko literówka)? Jeśli nie, w jaki sposób odnoszą się do siebie nawzajem? –

+0

Właściwie to zamaskowałem go z mojego oryginalnego kodu, więc najprawdopodobniej jest to literówka. Przepraszam za to. Stan to opis, potrzebuję uzyskać liczbę każdego opisu dla wszystkich pasujących do klauzuli Where. Potrzebuję tego, aby "nakarmić" PieChart, używając tego: http://blog.platformular.com/2012/03/20/load-google-chart-by-ajax-using-asp-net-mvc-and- jquery /. Ten kod znajduje się w moim repozytorium i teraz kompiluje się z pomocą. dzięki! Teraz utknąłem na kontrolerze, ale muszę to teraz sprawdzić, bo to naprawiłem. – N8K8

1

Ten jest dobry

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

Ale spróbuj tego.

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