У меня есть объект, который выглядит так:
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; }
}
Крошечный образец данных:
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
В конечном итоге я пытаюсь получить результат, который представляет собой список уровней, внутри уровней - список классов, а внутри класса - отдельная группа TankName с суммами сражений и побед.
Можно ли сделать все это в одном операторе LINQ? Или есть другой способ легко получить результат? (Я знаю, что могу легко перебрать DbSet несколько раз, чтобы создать список, который мне нужен; я надеюсь на более эффективный способ получения того же результата с LINQ.)
3 ответа
Это должно сделать это:
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
};
group mt by {mt.Tier, mt.Class, mt.TankName} into g
group mt by new {mt.Tier, mt.Class, mt.TankName} into g
и Wins = g.Sum(mt=> mt.Victories)
Вы также можете использовать синтаксис метода. Это должно дать вам то же самое, что и @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)
});
Какой синтаксис вы используете, зависит от ваших предпочтений. Удалите .Select, чтобы вернуть IGrouping, который позволит вам перечислять группы.
var result = memberTanks.GroupBy(x => new {x.Tier, x.Class, x.TankName})
Я продолжал пытаться получить полезные результаты из ответа Злого Грибо. Хотя ответ действительно дает результаты (после исправления проблем с компиляцией, упомянутых в ответах), он не дает мне того, что я действительно искал (что означает, что я недостаточно хорошо объяснил себя в вопросе).
Feanz оставил комментарий в моем вопросе, чтобы проверить сайт MS с примерами LINQ, и, хотя я думал, что заглядывал туда раньше, на этот раз я нашел их пример вложенных групповых байтов и попробовал их. Следующий код дает мне именно то, что я искал:
var result = from mt in db.MemberTanks
group mt by mt.Tier into tg
select new
{
Tier = tg.Key,
Classes = from mt in tg
group mt by mt.Class into cg
select new
{
Class = cg.Key,
TankTypes = from mt in cg
group mt by mt.TankName into tng
select new
{
TankName = tng.Key,
Battles = tng.Sum(mt => mt.Battles),
Victories = tng.Sum(mt => mt.Victories),
Count = tng.Count()
}
}
};
Я оставлю ответ г-на Грибо проверенным, так как большинство людей, вероятно, получит от этого наилучшие результаты.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.