2016-06-27 9 views
0

私はレコードのカウントを返すためにSQLクエリを書く方法を学び、それをIDでグループ化してリストに戻そうとしています。私はいくつかのことを試してみましたが、私は私のリポジトリで、これまでに試してみましたがどのような暗黙のうちにSystem.Linq.IQueryable..etcLinq toコントローラbyコントローラ

「に」>型System.Collections.Generic.List <を変換することはできません取得維持している:

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と:

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

だから、あなたがそのようにこれを使用することができます名前はチェックリストオブジェクトではありません – Chris

答えて

1

GetAllComplaintsCount()の返品タイプはIQueryable<CHECKLIST>です。しかし、あなたのクエリで、あなたは

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

で匿名型を作成して、あなたはこの匿名型のList<T>を返すようにしてみてください。これはIQueryable<CHECKLIST>にキャストできません。

AmountNameという名前のプロパティ(クエリで使用する)を持つCHECKLISTというクラス(または構造体)があると思います。さて、代わりに匿名型のインスタンスを作成するのではなく、そのCHECKLISTのインスタンスを作成します。

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

、あなたがIQueryableではなく、完成Listを返したいと.ToList()をOMMIT。

後でクエリを実行しますが列挙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:あなたのよう

(おそらく)012と要素のを知って、実際にシューッという音では、まったく異なる戻り値の型が考えられます。あなたのMonitorEnteredEmpID要素にマップDictionary<int, int>について数える方法:

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

ありがとうございます! MonitorEnteredEmpIDでグループ化されたすべてのチェックリスト項目の数を返すことができる例を私に与えてもらえますか?私はまた、これを行う方法についてちょっと混乱しています。この答えは素晴らしいですし、チェックリスト内のオブジェクトを返すだけです。単にMonitorEnteredEmpIDの2つの列とMonitorEnteredEmpIDの数を持つリストの結果が必要です。 – epv

+0

@epv私はあなたを正しく理解しているかどうかはわかりませんが、これは私の最後のバージョンがしていることとまったく同じだと思います。辞書のキーは 'MonitorEnteredEmpID'であり、値はこれらのIDの出現です。 –

+0

もう一度ありがとう!特定のIDをただ知りたくないということを除いて、私は正しく理解していました。すべてのIDのリストと、そのチェックリストに関連するカウントが必要です。たとえば、複数の人にチェックリストを入力させる場合があり、チェックリストに入力されたすべての人数を知りたいとします。 – epv