我无法找到创建复杂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世界的新手,我正在努力保持“精益控制器”,“胖模型”和“虚拟视图”设计建议,因此我可以遵循良好的做法。感谢您的投入。
答案 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);