如何构建具有多个GroupBys的LINQ?

Sai*_*udo 9 c# linq entity-framework

我有一个看起来像这样的实体:

public partial class MemberTank
{
    public int Id { get; set; }
    public int AccountId { get; set; }
    public int Tier { get; set; }
    public string Class { get; set; }
    public string TankName { get; set; }
    public int Battles { get; set; }
    public int Victories { get; set; }
    public System.DateTime LastUpdated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一小部分数据样本:

 Id   AccountId   Tier   Class  TankName   Battles  Victories
 ---  ---------   ----   -----  ---------  -------  ----------
 1    432423      5      Heavy  KV         105      58
 2    432423      6      Heavy  IS         70       39
 3    544327      5      Heavy  KV         200      102
 4    325432      7      Medium KV-13      154      110
 5    432423      7      Medium KV-13      191      101
Run Code Online (Sandbox Code Playgroud)

最终我试图获得一个层级列表的结果,层级内是一个类列表,并且在类中是TankName与战斗和胜利之和的独特分组.

是否可以在单个LINQ语句中完成所有这些操作?或者还有另一种方法可以轻松获得结果吗?(我知道我可以轻松遍历DbSet几次以生成我想要的列表;我希望有一种更有效的方法来获得与LINQ相同的结果.)

The*_*ebo 10

这应该这样做:

var output = from mt in MemberTanks
             group by {mt.Tier, mt.Class, mt.TankName} into g
             select new { g.Key.Tier, 
                          g.Key.Class, 
                          g.Key.TankName, 
                          Fights = g.Sum(mt => mt.Battles), 
                          Wins = g.Sum(mt=> mt.Victories
                        };
Run Code Online (Sandbox Code Playgroud)


Nin*_*Nye 6

您也可以使用Method语法.这应该与@TheEvilGreebo相同

var result = memberTanks.GroupBy(x => new {x.Tier, x.Class, x.TankName})
                        .Select(g => new { g.Key.Tier, 
                                           g.Key.Class, 
                                           g.Key.TankName, 
                                           Fights = g.Sum(mt => mt.Battles), 
                                           Wins = g.Sum(mt=> mt.Victories)
                        });
Run Code Online (Sandbox Code Playgroud)

您使用哪种语法归结为首选.删除.Select以返回IGrouping,这将使您能够枚举组

var result = memberTanks.GroupBy(x => new {x.Tier, x.Class, x.TankName})
Run Code Online (Sandbox Code Playgroud)