C# 如何让AutoMapper:忽略未映射的属性,包括常规映射和使用QueryableExtensions

C# 如何让AutoMapper:忽略未映射的属性,包括常规映射和使用QueryableExtensions,c#,automapper,iqueryable,C#,Automapper,Iqueryable,我发现了两种解决方案,可以忽略未映射的属性,但也可以忽略常规映射,并且不使用返回IQueryable(不知道为什么,但我得到的错误参数类型不匹配) 是否有人有办法忽略涵盖上述两个方面的未映射属性?问题已解决。它就在这一行代码中 .ForMember(p=>p.Gender,opt=>opt.MapFrom(c=>c.GenderCode)) 其中p.Gender为int型,GenderCode为int型?。那么换成 .ForMember(p=>p.Gender,opt=>opt.MapFrom(

我发现了两种解决方案,可以忽略未映射的属性,但也可以忽略常规映射,并且不使用返回IQueryable(不知道为什么,但我得到的错误参数类型不匹配)


是否有人有办法忽略涵盖上述两个方面的未映射属性?

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

.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之前,上面的映射代码一直在工作。

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

.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之前,上面的映射代码一直在工作。

使用时,必须对某些类型转换进行显式转换,例如
int?
int
。这可能是“参数类型不匹配”异常的来源

如果您有许多属性需要进行类型转换,比如您有许多其他属性,您正在执行
c.MyVariable??0
--您可以定义转换规则,而不必对每个属性都明确说明

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

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

cfg.CreateMap<int?, int>().ProjectUsing(src => src.HasValue ? src.Value : 0);
cfg.CreateMap().ProjectUsing(src=>src.HasValue?src.Value:0);
在使用时,必须对某些类型转换进行显式转换,例如
int?
int
。这可能是“参数类型不匹配”异常的来源

如果您有许多属性需要进行类型转换,比如您有许多其他属性,您正在执行
c.MyVariable??0
--您可以定义转换规则,而不必对每个属性都明确说明

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

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

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

在映射末尾使用
.ForAllOtherMembers(opt=>opt.Ignore())链接为我工作。这应该是方法链中的最后一个方法。

在映射末尾使用
.ForAllOtherMembers(opt=>opt.Ignore())链接为我工作。这应该是方法链中的最后一个方法。

只是信息性注释,IQueryable是否与其他自动映射一起工作?难道您不想“了解”IQueryable的结果,而不想尝试复制到DTO吗?将某些内容映射到IQueryable似乎不像您想要做的那样,因为您的DTO通常会跨越流程边界或作为JSON提供。您使用的AutoMapper版本是什么,您映射的IQueryable表达式类型是什么?LINQ to SQL,LINQ to EF,other?@CodeMonkeyKing我在阅读()之后,今天早些时候已经更新到了最新的2.2.1版本,但是没有运气(仍然是相同的错误)。IQueryable可以与其他贴图配合使用,包括使用“IgnoreAllUnmapped”贴图。我不想“意识到”IQueryable,否则它会带来大量不必要的数据,因为我将从GetAll()或Table()调用在存储库中。我将测试床回滚到2.1.262,以尝试复制您的问题,并查看是否可以让IgnoreAllNonExisting正常工作。这是我给您的唯一建议:尝试在未映射的属性名称上使用循环中的CanResolveValue():
if(existingMaps.GetPropertyMaps()。任何(pm=>pm.CanResolveValue()&&pm.SourceMember.Name==property)){expression.ForMember(property,opt=>opt.Ignore());}
只是信息性注释,IQueryable可以与其他自动映射一起使用吗?您不想“实现”吗IQueryable的结果而不是试图复制到DTO?将某些内容映射到IQueryable似乎不像您想要做的那样,因为您的DTO通常会跨越进程边界或作为JSON提供。您使用的AutoMapper版本是什么,您映射的IQueryable表达式类型是什么?LINQ到SQL,LINQ到EF,其他?@CodeMonkeyKing I在阅读()之后,今天早些时候已经更新到最新的2.2.1版本,但是没有运气(仍然是相同的错误)。IQueryable可以与其他映射一起工作,包括使用“IgnoreAllUnmapped”映射。我不想“实现”IQueryable,否则它将带来大量不必要的数据,因为我将从GetAll()或Table()调用它在存储库中。我将测试床回滚到2.1.262,以尝试复制您的问题,并查看是否可以让IgnoreAllNonExisting正常工作。这是我给您的唯一建议:尝试在未映射的属性名称上使用循环中的CanResolveValue():
if(existingMaps.GetPropertyMaps()。任何(pm=>pm.CanResolveValue()&&pm.SourceMember.Name==property)){expression.ForMember(property,opt=>opt.Ignore());}