我找到了两种忽略非映射属性的解决方案,但其中一个也忽略了常规映射,第二个不适用于QueryableExtensions以返回 IQueryable(不知道为什么,但我收到错误Argument types do not match)。
有没有人有解决方案来忽略涵盖上述两个方面的非映射属性?
我找到了两种忽略非映射属性的解决方案,但其中一个也忽略了常规映射,第二个不适用于QueryableExtensions以返回 IQueryable(不知道为什么,但我收到错误Argument types do not match)。
有没有人有解决方案来忽略涵盖上述两个方面的非映射属性?
使用QueryableExtensions时,您必须明确地进行某些类型转换,例如int?
to int
。这可能是“参数类型不匹配”异常的来源。
如果您有许多需要类型转换的属性(例如,如果您发现您正在执行许多其他属性),则c.MyVariable ?? 0
可以改为定义转换规则,而不必明确说明每个属性。
通常,要在 Automapper 中进行类型转换,您会使用ConvertUsing
,但在使用 QueryableExtensions 时,您需要改为使用ProjectUsing
.
您可以使用以下行,它将处理从int?
到的所有映射,int
而无需显式指定每个属性的映射:
cfg.CreateMap<int?, int>().ProjectUsing(src => src.HasValue ? src.Value : 0);
在映射结束时与.ForAllOtherMembers(opt => opt.Ignore());
为我工作的链接。这应该是方法链中的最后一个方法。
问题解决了。在这行代码中
.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode))
其中 p.Gender 是 int 类型,而 GenderCode 是 int? 类型。所以改变为
.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode ?? 0))
解决了这个问题。难以排除故障的是,在我尝试返回 IQueryable 之前,上面的映射代码一直在工作。