如何使用自定义映射映射一对多关系

时间:2014-06-26 16:08:47

标签: c# automapper

我正在学习如何使用AutoMapper,我正在掌握它。但是,如果你有一对多的关系怎么办?您可以执行类似this的操作,对吧?

但是,如果场景是这样的,你只想要列表中的最后一个值。让我来证明一下。

public class Item
{
  public Item()
  {
    Prices = new HashSet<Price>();
  }
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Price> Prices { get; set; }
}

public class Price
{
  public int Id { get; set; }
  public int ItemId { get; set; }
  public decimal Price { get; set; }

  public virtual Item Item { get; set; }
}

public class ItemVM
{
  public string Name { get; set; }
  public decimal Price { get; set; }
}

现在,问题是我要映射ItemVM.Price = The last value in Price class。这可能吗?

我尝试过这样的事情,但没有奏效。

Mapper.CreateMap<Item, ItemVM>()
  .ForMember(dto => dto.Price, opt => opt.MapFrom(s => s.Prices.LastOrDefault().Price));

然后

var items = All.Project().To<ItemVM>();

但是给我一个InvalidOperation的错误。任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:3)

您的地图看起来很不错,但也许您正在获得NullReferenceException。我会这样映射:

[被修改]

Mapper.CreateMap<Item, ItemVM>()
.ForMember(dto => dto.Price, opt => 
           opt.MapFrom(s => s.Prices.Any()?
           s.Prices.OrderByDescending ().First ().Price:0));