Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个GroupJoin的LINQ_C#_Linq - Fatal编程技术网

C# 具有多个GroupJoin的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

设想以下情况:

每个玩家(一个实体)可以进行任意数量的攻击(一个实体)。攻击可能导致杀死(实体)。攻击。玩家映射到参与攻击的玩家。杀死。攻击映射到导致杀死的攻击。因此,Kill.Attack.Player会将一个Kill映射到一个玩家

我想发表以下报告: 玩家A发动10次攻击,造成7人死亡。 玩家B进行了8次攻击,造成4人死亡。 玩家C进行了0次攻击,导致0次死亡

我如何使用LINQ做到这一点?我想我能做到:

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