C# 如何在automapper中为具有复杂关系的类进行映射

C# 如何在automapper中为具有复杂关系的类进行映射,c#,asp.net-mvc,automapper,C#,Asp.net Mvc,Automapper,到目前为止,我只有如下所示的ItemName和ItemPrice: public class Item { public string Name { get; set; } public virtual ICollection<Stock> Stocks { get; set; } public virtual ICollection<Price> Prices { get; set; } -- remove some code for brevity

到目前为止,我只有如下所示的
ItemName
ItemPrice

public class Item
{
  public string Name { get; set; }

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

  -- remove some code for brevity --
}

public Stock
{
  public int Id { get; set; }
  public int ItemId { get; set; }
  public int StorageId { get; set; }
  public float Amount { get; set; }

  public virtual Item Item { get; set; }
  public virtual Storage Storage { get; set; }

  -- remove some code for brevity --
}

public class Storage
{
  public string Name { get; set; }

  public virtual ICollection<Stock> Stocks { get; set; }

  -- remove some code for brevity --
}

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

  public virtual Item Item { get; set; }

  -- remove some code for brevity --
}
Name   : Snack bar
Price  : $1.00
Stocks :
         Storages    | How many
         Storage1    | 23
         Storage2    | 24
         Storage3    | 10
Mapper.CreateMap<Item, ItemDTO>()
      .ForMember(dto => dto.Price, opt => 
          opt.MapFrom(s => s.Prices.Any() ? s.Price.OrderByDescending(i => i.Id).FirstOrDefault() : 0m));
Mapper.CreateMap()
.ForMember(dto=>dto.Price,opt=>
opt.MapFrom(s=>s.Prices.Any()?s.Price.OrderByDescending(i=>i.Id.FirstOrDefault():0m));
然后按如下方式存储它们:

public class Item
{
  public string Name { get; set; }

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

  -- remove some code for brevity --
}

public Stock
{
  public int Id { get; set; }
  public int ItemId { get; set; }
  public int StorageId { get; set; }
  public float Amount { get; set; }

  public virtual Item Item { get; set; }
  public virtual Storage Storage { get; set; }

  -- remove some code for brevity --
}

public class Storage
{
  public string Name { get; set; }

  public virtual ICollection<Stock> Stocks { get; set; }

  -- remove some code for brevity --
}

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

  public virtual Item Item { get; set; }

  -- remove some code for brevity --
}
Name   : Snack bar
Price  : $1.00
Stocks :
         Storages    | How many
         Storage1    | 23
         Storage2    | 24
         Storage3    | 10
Mapper.CreateMap<Item, ItemDTO>()
      .ForMember(dto => dto.Price, opt => 
          opt.MapFrom(s => s.Prices.Any() ? s.Price.OrderByDescending(i => i.Id).FirstOrDefault() : 0m));
var items=\u itemService.All.Project().To();

简而言之,如何为属性成员的其余部分进行映射?有什么建议吗?演示代码会很好。非常感谢

这里有一个例子可以添加到我的评论中

假设你有这些课程

模型

您只需按如下方式配置Automapper:

public class ItemViewModel
{
  public string Name { get; set; }

  public StockViewModel [] Stocks { get; set; }
  public PriceViewModel [] Prices { get; set; }
}
AutoMapper.CreateMap();
AutoMapper.CreateMap();
AutoMapper.CreateMap();

然后,自动映射器将自动确定子组件列表的映射。

只是一个旁注:当输入和输出类的属性名称匹配时,您不必指定任何内容,只需指定类映射(根和叶)。因此,您可以映射价目表,让客户决定显示哪一个。这将减少映射逻辑,我总是觉得这更令人欣慰。谢谢我很想看到一些示例代码,因为我在演示中学到了很多:)这是否意味着您不需要为
StockViewModel
PriceViewModel
创建类?您仍然需要创建这些类。但您不必向自动映射器明确解释对象结构。自动映射器知道每个复合元素类的映射就足够了。基本列表和集合映射是隐式完成的。这些配置的顺序重要吗?我不这么认为,但必须有其他人来确认。