2016-12-30 18 views
1

我越來越想做一個分組查詢的投影時,下面的錯誤,這是由兩個屬性分組,使用Automapper使用從IGrouping`2到ModelName的Missing映射投影GroupBy時出現多個鍵錯誤。創建使用Mapper.CreateMap <IGrouping`2,MODELNAME>

缺少從地圖IGrouping`2到PlayerWarScore。創建使用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功能,它可以使它變得簡單。我已經嘗試過將實體映射到黑暗中的組合鍵模型和其他鏡頭,但迄今沒有任何運氣。

回答

2

爲了使你的映射工作,你需要使用PlayerWarGroupBy鍵,而不是匿名類型(new {score.Player, score.Battle.War})爲您目前:

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

謝謝,但我不使用匿名類型,我正在做你已經顯示的內容(除了Project()。()),並給出錯誤 – Klors

+1

@Klors你*使用匿名類型:'new {score.Player,score.Battle .WAR}'。 –

+0

好吧,你發佈的代碼片段*使用匿名類型,因此是答案。我在發佈之前測試了我的答案(使用AutoMapper v5.2.0),並且它可以正常工作。如果我將'new PlayerWar {...}'更改爲'new {...}',那麼我會得到你所說的異常。 –