AutoMapper一对多模型到ViewModel问题

时间:2013-01-04 00:16:29

标签: c# asp.net-mvc automapper

我无法找到创建复杂ViewModel的正确方法。

模型B类:

public class A{public int A_id;}
public class B{
 public int B_id; 
 public string Name; 
 public virtual ICollection<A> A_Items;
}

ViewModel C类:

public class C {public int B_id; public CountOfA;}

所以我正在尝试寻找另一种方法来包含B类中A的出现次数并将其放入ViewModel类C.目前我可以创建Custom IResolver类,就像这样。

CreateMap<B,C>().ForMember(dest => dest.CountOfA, opt => opt.ResolveUsing<ListToCountResolver>());

然后在控制器中我使用“Include”方法来包含“A_Items”,这很好用。但是必须有一个更好的方法,当我想要的只是行的简单COUNT(*)时,不要从数据库中获取整个列表。或者每次我尝试从B类获取一些自定义值时,我是否必须创建自定义解析器。获取行的计数只是一个示例,但如果我想使用以逗号分隔的AutoMapper将“A”Collection的“Name”转换为单个字符串,该怎么办?那有可能吗?仅供参考,我是MVC世界的新手,我正在努力保持“精益控制器”,“胖模型”和“虚拟视图”设计建议,因此我可以遵循良好的做法。感谢您的投入。

1 个答案:

答案 0 :(得分:1)

您可以使用简单的MapFrom实现,看起来像这样:

Mapper.CreateMap<B, C>().ForMember(dest => dest.CountOfA, opt => opt.MapFrom(src => src.A_Items.Count()));

我创建了一个小单元测试,它运行正常。

var b = new B {A_Items = new Collection<A>{new A(), new A(), new A()}, B_id = 1};

var c = Mapper.Map<C>(b);

c.CountOfA.Should().Be(3);
c.B_id.Should().Be(1);