如何使AutoMapper:忽略非映射属性,包括常规映射和使用QueryableExtensions

时间:2013-04-20 17:07:22

标签: c# automapper iqueryable

我找到了两个忽略非映射属性的解决方案,但one of them也忽略了传统映射,second不能与QueryableExtensions一起返回IQueryable(don')知道原因,但我得到错误参数类型不匹配)。

有没有人有解决方案来忽略涵盖上述两个方面的非映射属性?

3 个答案:

答案 0 :(得分:3)

使用QueryableExtensions时,您必须明确某些类型转化,例如int?int。这可能是"参数类型不匹配的来源"异常。

如果您有许多需要进行类型转换的属性 - 例如,如果您有许多其他属性,您发现正在执行c.MyVariable ?? 0 - 您可以改为定义转换规则,而不必明确每一个属性。

通常,要在Automapper中进行类型转换,您可以使用ConvertUsing,但在使用QueryableExtensions时,您需要使用ProjectUsing

您可以使用以下行,它将处理从int?int的所有映射,而无需显式指定每个属性的映射:

cfg.CreateMap<int?, int>().ProjectUsing(src => src.HasValue ? src.Value : 0);

答案 1 :(得分:1)

问题解决了。它就在这行代码中

.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。

答案 2 :(得分:1)

使用.ForAllOtherMembers(opt => opt.Ignore());进行映射的末尾链对我很有效。这应该是方法链中的最后一个方法。