2016-06-27 4 views
0

Я пытаюсь научиться писать запрос sql, чтобы возвращать количество записей, а затем группировать их по идентификатору и возвращать его в список. Я попробовал несколько вещей, и продолжать получать не может неявно преобразовать тип System.Collections.Generic.List <> «на» System.Linq.IQueryable..etcLinq to SQL Group от контроллера

То, что я пытался до сих пор в моем хранилище:

public IQueryable<CHECKLIST> GetAllComplaintsCount() 
    { 
     try 
     { 
      return _context.Checklists 
       .GroupBy(a => a.MonitorEnteredEmpID) 
       .Select(a => new { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key }) 
       .ToList(); 
     } 
     catch (Exception ex) 
     { 
      _logger.LogError("Could not get am with checklist", ex); 
      return null; 
     } 
    } 

Если изменить его к IEnumerable я получаю эту ошибку:

Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type: int Amount, int Name>>' to 'System.Collections.Generic.IEnumerable 

Вопрос

Может кто-нибудь, пожалуйста, посоветуйте мне, что я делаю неправильно, и как я могу вернуть счет всех контрольных списков EntereredEMPID?

+0

общественного IQueryable неправильно, как ваше возвращение является новый объект с количеством и имя не объект контрольного списка – Chris

ответ

1

Тип возврата вашего метода GetAllComplaintsCount(): IQueryable<CHECKLIST>. Но в вашем запросе, создать анонимный тип в

.Select(a => new { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key }) 

и вы пытаетесь вернуть List<T> этого анонимного типа. Таким образом, это невозможно отличить от IQueryable<CHECKLIST>.

Так что я предполагаю, что у вас есть класс (или структура) называется CHECKLIST, который имеет свойства, называемые Amount и Name (как вы их использовать в запросе). Теперь, вместо создания экземпляров анонимного типа, создавать экземпляры этого CHECKLIST:

return _context.Checklists 
      .GroupBy(a => a.MonitorEnteredEmpID) 
      .Select(a => new CHECKLIST { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key }); 

и ommit в .ToList(), как вы хотите, чтобы вернуть IQueryable и не закончил List.

Конечно, если вы не хотите, чтобы выполнить запрос позже, но возвращать перечисленные List, вам необходимо изменить подпись вашего метода List<CHECKLIST> и использовать .ToList() так:

public List<CHECKLIST> GetAllComplaintsCount() 
{ 
    try 
    { 
     return _context.Checklists 
      .GroupBy(a => a.MonitorEnteredEmpID) 
      .Select(a => new CHECKLIST { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key }) 
      .ToList(); 
    } 
    catch (Exception ex) 
    { 
     _logger.LogError("Could not get am with checklist", ex); 
     return null; 
    } 
} 

UPDATE:

Как вы (возможно) на самом деле свистеть знать количество элементов с MonitorEnteredEmpID, вы можете рассмотреть совершенно другой тип возврата. Как насчет Dictionary<int, int>, который отображает ваш MonitorEnteredEmpID к элементу подсчитывать:

public Dictionary<int, int> GetAllComplaintsCount() 
{ 
    try 
    { 
     return _context.Checklists 
      .GroupBy(a => a.MonitorEnteredEmpID) 
      .ToDictionary(g => g.Key, g => g.Count); 
    } 
    catch (Exception ex) 
    { 
     _logger.LogError("Could not get am with checklist", ex); 
     return null; 
    } 
} 

Таким образом, вы можете использовать это так:

Dictionary<int, int> result = GetAllComplaintsCount(); 
Console.WriteLine("ID  COUNT"); 
foreach(int id in result.Keys) 
    Console.WriteLine($"{id}  {result[id]}"); 
+0

Спасибо! Не могли бы вы так любезно дать мне пример, где я могу вернуть счет всех элементов контрольного списка, сгруппированных по MonitorEnteredEmpID? Я также немного запутался в том, как это сделать, этот ответ велик и возвращает только объекты в контрольных списках. Мне просто нужен результат списка с двумя столбцами MonitorEnteredEmpID и счетчиком MonitorEnteredEmpID. – epv

+0

@epv Я не уверен, правильно ли я вас понимаю, но я думаю, что это именно то, что делает моя последняя версия. Ключами в словаре являются «MonitorEnteredEmpID», а значения - это значения этих идентификаторов. –

+0

Еще раз спасибо! Вы правильно поняли меня, за исключением того, что я не хочу просто знать один конкретный идентификатор, я хочу, чтобы список всех идентификаторов был связан с их контрольным списком. Например, у меня может быть несколько человек, входящих в контрольный список, и я хочу знать количество всех их введенных в контрольных списках. – epv