C# 自动映射一对多模型到视图模型问题

C# 自动映射一对多模型到视图模型问题,c#,asp.net-mvc,automapper,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; } 因此,我试图找到另一种方法,将A在B类中的出现次数包括在内,并将其放入ViewModel类C中。目前,我可以通过创建自定义IResolver类来实现这一点,如下所

我很难找到创建复杂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;
}
因此,我试图找到另一种方法,将A在B类中的出现次数包括在内,并将其放入ViewModel类C中。目前,我可以通过创建自定义IResolver类来实现这一点,如下所示

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

因此,在控制器中,我使用“Include”方法来包含“A_项”,这很好。但是必须有一种更好的方法来做到这一点,当我只需要简单的行计数(*)时,不要从数据库中获取整个列表。或者每次我试图从B类中获取一些自定义值时,我都必须创建一个自定义解析器。获取行数只是一个示例,但是如果我想使用逗号分隔的AutoMapper将“A”集合的“Name”转换为单个字符串,该怎么办。那可能吗?仅供参考,我对MVC世界是相当陌生的,我正试图坚持“精益控制器”、“胖模型”和“虚拟视图”的设计建议,以便我能够遵循良好的实践。感谢您的输入。

您可以使用简单的
映射从
实现,它可能看起来像这样:

Mapper.CreateMap<B, C>().ForMember(dest => dest.CountOfA, opt => opt.MapFrom(src => src.A_Items.Count()));
Mapper.CreateMap().formMember(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);
var b=new b{A_Items=new Collection{new A(),new A(),new A()},b_id=1};
var c=Mapper.Map(b);
c、 CountOfA.Should()为(3);
c、 B_id.应()为(1);

谢谢。这更有意义。如果我想将“A”集合的名称转换成单个字符串,我想我可以运行任何LINQ查询。调用
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);