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

Posted

技术标签:

【中文标题】如何使用自定义映射映射一对多关系【英文标题】:how to map one-to-many relationship with custom mapping 【发布时间】:2014-06-26 16:08:47 【问题描述】:

我正在学习如何使用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&lt;ItemVM&gt;();

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

【问题讨论】:

你如何定义the last value?按日期,还是按 ID? 我想通过Price.ItemId获取Item.Prices列表中的最后一个值 【参考方案1】:

您的映射看起来不错,但也许您得到的是NullReferenceException。我会这样映射它:

[已编辑]

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

【讨论】:

?s:0 有什么作用?顺便说一句,我是Linq 的新人。认为你可以启发我更多?这将是一个很大的帮助。 a?x:y 表示if (a) x; else b;。在这种情况下,如果集合没有任何项目,它会赋值为零。这可以防止异常。 哦! ternary operator 没有意识到这一点。我以为它在 linq 本身上。但我试过你的,但给了我一个System.NotSupportedException。真的卡在这里了。从昨晚开始就一直在敲我的头。 在这种情况下,您可能会得到类似这样的信息:***.com/questions/7253529/…。然后尝试更改LastOrDefault 并使用Reverse().First ()OrderByDescending ().First () 或类似的东西? 哇!它确实有效!非常感谢你,伙计。现在我可以继续前进了。真的。非常感谢。认为您可以在上面的答案中添加它?供其他人参考:)

以上是关于如何使用自定义映射映射一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

mybatis如何实现一对多关联关系

MyBatis注解开发---实现自定义映射关系和关联查询

MyBatis自定义映射resultMap

如何在Javascript中映射数组一对多关系

MyBatis自定义映射resultMap

使用具有一对多关系的 JPA 映射实体,如何添加连接条件