投影具有多个键的 GroupBy 错误,缺少从 IGrouping`2 到 ModelName 的映射。使用 Mapper.CreateMap<IGrouping`2, ModelName> 创建

Projecting a GroupBy with multiple keys errors with Missing map from IGrouping`2 to ModelName. Create using Mapper.CreateMap<IGrouping`2, ModelName>

尝试使用 Automapper

对按两个属性分组的分组查询进行投影时出现以下错误

Missing map from IGrouping`2 to PlayerWarScore. Create using Mapper.CreateMap<IGrouping`2, PlayerWarScore>

我目前正在尝试类似的方法,如果 PlayerWarScore

的实体 属性,则效果很好
Mapper.CreateMap<IGrouping<PlayerWar, Score>, PlayerWarScore>
    .ForMember(model => model.PlayerName, model => model.MapFrom(grouping => grouping.Key.Player.Name))
    .ForMember(model => model.WarName, model => model.MapFrom(grouping => grouping.Key.War.Name)),
    .ForMember(model => model.Score, model => model.MapFrom(grouping => grouping.Sum(score => score.Score));

但是当 PlayerWar 不是一个实体,而是一个模型,它只是为了保存由两个实体组成的组合键而创建的,如下所示,然后我得到错误

public class PlayerWar
{
    public Player Player { get; set; }
    public War War { get; set; }
}

例如,我想要实现的是,给定以下 EF6 实体。

public class Score
{
    public Player Player { get; set; }
    public Battle Battle { get; set; }
    public int Score { get; set; }
}

public class Player
{
    public string Name { get; set; }
}

public class Battle
{
    public string Name { get; set; }
    public War War { get; set; }
}

public class War
{
    public string Name { get; set; }
}

以及我希望将它们投射到的另一个模型

public class PlayerWarScore
{
    public string PlayerName { get; set; }
    public string WarName { get; set; }
    public int Score { get; set; }
}

如何使用 Automapper 的 Project().To<PlayerWarScore>() 实现以下查询?

context.Scores
    .GroupBy(score => new {score.Player, score.Battle.War})
    .Select(grouping => new PlayerWarScore {
        PlayerName = grouping.Key.Player.Name,
        WarName = grouping.Key.War.Name,
        Score = grouping.Sum(score => score.Score)
    })
    .ToList()

我感觉我正在以错误的方式接近它,或者缺少一个明显的 Linq 功能,可以使它变得简单。我已经尝试将实体映射到组合关键模型和其他黑暗中的镜头,但到目前为止没有任何运气。

为了使您的映射工作,您需要使用 PlayerWar 作为 GroupBy 密钥,而不是像您当前那样使用匿名类型 (new {score.Player, score.Battle.War}):

context.Scores
    .GroupBy(score => new PlayerWar { Player = score.Player, War = score.Battle.War })
    .ProjectTo<PlayerWarScore>()
    .ToList();