如何使用自定义映射映射一对多关系
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<ItemVM>();
但是给了我一个 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 ()
或类似的东西?
哇!它确实有效!非常感谢你,伙计。现在我可以继续前进了。真的。非常感谢。认为您可以在上面的答案中添加它?供其他人参考:)以上是关于如何使用自定义映射映射一对多关系的主要内容,如果未能解决你的问题,请参考以下文章