2017-06-28 9 views
0

私はGroupByIncludeを多かれ少なかれ理解していますが、含まれるレコードをまとめてグループ化することはできますか?エンティティフレームワーク/ Linqグループ関連データ

は、私は私のコントローラでは、この作業があります。

public async Task<IActionResult> Index() 
{ 
    return View(await _context.Organizations.Include(x => x.Members).ToListAsync()); 
} 

私に私組織とそのメンバーを与える...しかし、私は自分のチームの中でグループ化されたメンバーを求めています。私は何かのように思った:

public async Task<IActionResult> Index() 
{ 
    return View(await _context.Organizations.Include(
     x => x.Members.GroupBy(m => m.Team)).ToListAsync()); 
} 

しかしそれは間違っています。

私は、返されたデータは、周りの(必ずしも必要ではないが、正確に)何かになりたい:

[ 
    { 
     "ID" : "some-guid-string" 
     "Name" : "MyOrganization", 
     "Members" : { 
      "Team1" : [ 
       "MemberName" : "John", 
       "MemberName" : "Jess", 
       "MemberName" : "Joe", 
      ], 
      "Team2" : [ 
       "MemberName" : "Jake", 
       "MemberName" : "Jeff" 
      ] 
     } 
    } 
] 
+1

、私はあなたの問題は、おそらくあなたが戻ってきているという事実から来ると言うことができ、このようなJSON出力を得るために

多くのメンバーがいるエンティティ組織 私は、匿名のオブジェクトのリストを返すSelectを行う組織を選択し、そのselectフェッチのメンバーエンティティからグループ化することができます。Dictionaryとしてキャストされたチームによってグループ化される

+0

y @DanyEllementが示唆しているように、匿名型を返すのは気にしないでください: 'return View(x => x.Members).Select(x => new {ID = x .It、Name = x.Name、Members = x.Members.GroupBy(m => m.Team)})。ToListAsync()); 'そうでなければ、' Organization'型を使いたい場合は、内部に新しいフィールドを追加して、必要な「新しい」メンバー構造を格納します。 –

答えて

1

私はあなたが明示的クエリでコード化されるフィールドを含める必要はないと思います。しかし、私が間違っている場合は、_context.Organizations_context.Organizations.Include(o => o.Members).Include(o => o.Members.Select(m => m.Team))に置き換えるだけで、リセットは同じです。

[ 
    { 
     "Id": "some-guid-string", 
     "Name": "MyOrganization", 
     "Members": 
     { 
      "Team1": 
      [ 
       "John", 
       "Jess", 
       "Joe" 
      ], 
      "Team2": 
      [ 
       "Jake", 
       "Jeff" 
      ] 
     } 
    } 
] 

がで行うことができる:あまり考えずに

_context.Organizations.Select(o => new 
{ 
    Id = o.Id, 
    Name = o.Name, 
    Members = 
     o.Members.GroupBy(m => m.Team) 
     .ToDictionary(kvp => kvp.Key.Name, kvp => kvp.Select(p => p.Name)) 
}); 
関連する問題