如果源字段需要按给定条件计算,有没有办法用自动映射器映射字段?
Is there a way to map a field with automapper if the source field needs to be counted by a given condition?
我基本上想按给定的条件来计算源字段。计划是计算导航属性的数量(1 个请求可以有多个安全检查,因此 Safechecks 在设计中是一个虚拟的 ICollection),但是用它自己的 Checktype 字段的值将它们分开,像这样:
MapperConfiguration config = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<ListRequestsViewModel, Requests>().ReverseMap()
.ForMember(d => d.Nr_Sum_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count))
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qlty")).Count))
.ForMember(d => d.Nr_Quantity_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qnty").Count));
}
);
第一个“ForMember”行是合法的,对于其他两个(Nr_Quality_SafeChecks 和 Nr_Quantity_SafeChecks),我得到“无法将 lambda 表达式转换为类型 'IValueResolver<Requests, ListRequestsViewModel, object>' 因为它不是委托类型”错误。所以这不能正常工作。
如何解决?
得到解决方案。
s.SafeChecks.Where(...) 子句 returns 不支持 .Count 的 IEnumerable。但是,它可以在像List这样的ICollection上调用,所以先转换成list应该可以解决问题。
MapperConfiguration config = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<ListRequestsViewModel, Requests>().ReverseMap()
.ForMember(d => d.Nr_Sum_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count))
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qlty")).ToList().Count))
.ForMember(d => d.Nr_Quantity_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qnty")).ToList().Count));
}
);
您可以使用 IEnumerable.Count()
.
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count(x => x.CheckType.Equals("Qlty"))))
我基本上想按给定的条件来计算源字段。计划是计算导航属性的数量(1 个请求可以有多个安全检查,因此 Safechecks 在设计中是一个虚拟的 ICollection),但是用它自己的 Checktype 字段的值将它们分开,像这样:
MapperConfiguration config = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<ListRequestsViewModel, Requests>().ReverseMap()
.ForMember(d => d.Nr_Sum_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count))
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qlty")).Count))
.ForMember(d => d.Nr_Quantity_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qnty").Count));
}
);
第一个“ForMember”行是合法的,对于其他两个(Nr_Quality_SafeChecks 和 Nr_Quantity_SafeChecks),我得到“无法将 lambda 表达式转换为类型 'IValueResolver<Requests, ListRequestsViewModel, object>' 因为它不是委托类型”错误。所以这不能正常工作。
如何解决?
得到解决方案。
s.SafeChecks.Where(...) 子句 returns 不支持 .Count 的 IEnumerable。但是,它可以在像List这样的ICollection上调用,所以先转换成list应该可以解决问题。
MapperConfiguration config = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<ListRequestsViewModel, Requests>().ReverseMap()
.ForMember(d => d.Nr_Sum_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count))
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qlty")).ToList().Count))
.ForMember(d => d.Nr_Quantity_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Where(x => x.CheckType.Equals("Qnty")).ToList().Count));
}
);
您可以使用 IEnumerable.Count()
.
.ForMember(d => d.Nr_Quality_SafeChecks, o => o.MapFrom(s => s.SafeChecks.Count(x => x.CheckType.Equals("Qlty"))))