C# 具有多个GroupJoin的LINQ
设想以下情况: 每个玩家(一个实体)可以进行任意数量的攻击(一个实体)。攻击可能导致杀死(实体)。攻击。玩家映射到参与攻击的玩家。杀死。攻击映射到导致杀死的攻击。因此,Kill.Attack.Player会将一个Kill映射到一个玩家 我想发表以下报告: 玩家A发动10次攻击,造成7人死亡。 玩家B进行了8次攻击,造成4人死亡。 玩家C进行了0次攻击,导致0次死亡 我如何使用LINQ做到这一点?我想我能做到:C# 具有多个GroupJoin的LINQ,c#,linq,C#,Linq,设想以下情况: 每个玩家(一个实体)可以进行任意数量的攻击(一个实体)。攻击可能导致杀死(实体)。攻击。玩家映射到参与攻击的玩家。杀死。攻击映射到导致杀死的攻击。因此,Kill.Attack.Player会将一个Kill映射到一个玩家 我想发表以下报告: 玩家A发动10次攻击,造成7人死亡。 玩家B进行了8次攻击,造成4人死亡。 玩家C进行了0次攻击,导致0次死亡 我如何使用LINQ做到这一点?我想我能做到: from player in Players join attack in Attac
from player in Players
join attack in Attacks on player equals attack.Player into attacksByPlayer
join kill in Kills on attack equals kill.Attack into killsByPlayer
select new { Player = player, Attacks = attacksByPlayer.Count(), Kills = killsByPlayer.Count() }
显然,由于各种原因,这是不正确的(并且不会构建)
另外,我如何创建相同的报告,但是使用一个内部连接,因为玩家C没有攻击,所以不会被报告
非常感谢你的帮助 下面的查询应该可以做到这一点。它将只显示进行攻击的玩家,并将为您计算攻击和死亡次数
using (Model m = new Model())
{
var result = from attack in m.Attacks
group attack by attack.Player into attacksForPlayer
select new
{
PlayerName = attacksForPlayer.Key.Name,
NumberOfAttacks = attacksForPlayer.Count(),
NumberOfKills = (from k in m.Kills
where attacksForPlayer.Contains(k.Attack)
select k).Count()
};
// The result can be read like this:
foreach (var r in result)
{
// r.PlayerName, r.NumberOfAttacks, r.NumberOfKills
}
}
你能从玩家到攻击,然后从每个附加到杀戮吗?嗨,安克尔。谢谢你的及时回复。不,它们由外键链接。所以,你有攻击。玩家和杀戮。攻击,但你不能穿越另一条路。谢谢,沃特。这很有效。还有许多可能的替代方案。我试图找到最干净、最简洁的解决方案,这种解决方案允许任意数量的表“左连接”并聚合它们的列,而无需进行额外的嵌套查询。我在下面发布的解决方案也是一个很好的解决方案。
from player in players
from attack in attacks.Where(attack => attack.Player == player).DefaultIfEmpty()
from kill in kills.Where(kill => kill.Attack == attack).DefaultIfEmpty()
group new { attack, kill } by player into g
select new {
Player = player,
Attacks = g.Count(x => x.attack != null),
Kills = g.Count(x => x.kill != null)
}