Группировать по, графа и лямбда-выражения

Я пытаюсь перевести следующий запрос:

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

В выражение лямбда. Я использую С# и EntityFramework, однако, похоже, я не могу заставить его работать. Вот что я имею в моем репозитории до сих пор:

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

Конечно, он не компилируется, и я теряюсь после googling в течение 2 часов. Не могли бы вы помочь мне?

заблаговременно

Ответы

Ответ 1

Здесь есть две проблемы:

  • Результат GroupBy будет перечислимым типа IEnumerable<IGrouping<TKey, TSource>>. Интерфейс IGrouping имеет только одно свойство, к которому вы можете получить доступ, Key, который является ключом, указанным в выражении GroupBy, и реализует IEnumerable<T>, чтобы вы могли выполнять другие операции Linq по результату.
  • Вам нужно указать имя свойства для анонимного типа, если оно не может быть выведено из выражения свойства или поля. В этом случае вы вызываете Count в IGrouping, поэтому вам нужно указать имя для этого свойства.

Попробуйте следующее:

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

Эквивалент синтаксиса запроса будет

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

В любом случае, если вы хотите, чтобы первое свойство называлось StateId вместо Key, просто измените его на

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

Ответ 2

Это хорошо

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

Но попробуйте это.

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