如果源字段需要按给定条件计算,有没有办法用自动映射器映射字段?

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"))))