【问题标题】: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列表中的最后一个值

标签: c# automapper


【解决方案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。真的卡在这里了。从昨晚开始就一直在敲我的头。
  • 在这种情况下,您可能会得到类似这样的信息:stackoverflow.com/questions/7253529/…。然后尝试更改LastOrDefault 并使用Reverse().First ()OrderByDescending ().First () 或类似的东西?
  • 哇!它确实有效!非常感谢你,伙计。现在我可以继续前进了。真的。非常感谢。认为您可以在上面的答案中添加它?供其他人参考:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多