如何让AutoMapper 6根据字段值忽略指定记录?
在AutoMapper 6中根据特定字段值跳过记录的实现方案
嘿,这个需求完全可以搞定!我给你分享两种实用的解决方案,你可以根据自己的场景来选:
方案一:映射前手动过滤数据源(简单直观)
这是最容易上手的方式,先通过Linq把需要忽略的记录筛选掉,再交给AutoMapper做映射。举个例子,假设你的源对象Source有个Status字段,当Status等于"Invalid"时就跳过映射:
// 获取原始的源数据集合 var rawSourceList = FetchYourSourceData(); // 过滤掉不符合条件的记录 var validSourceItems = rawSourceList.Where(item => item.Status != "Invalid"); // 执行映射得到目标集合 var destinationList = _mapper.Map<List<Destination>>(validSourceItems);
这种方法逻辑清晰,调试起来也方便,适合大多数普通场景。
方案二:通过AutoMapper配置自动过滤(适合规则复用)
如果你的项目里多个地方都需要用相同的过滤规则,或者想把过滤逻辑和映射规则绑定在一起,可以用AutoMapper的AddConditionalObjectMapper来配置对象级别的映射条件:
全局配置(对所有映射生效)
Mapper.Initialize(cfg => { // 添加条件映射器,只有满足条件的对象才会被映射 cfg.AddConditionalObjectMapper().Where((sourceObj, destType) => { // 针对Source类型的对象做判断,其他类型默认允许映射 if (sourceObj is Source source) { return source.Status != "Invalid"; // 不符合条件就跳过映射 } return true; }); // 配置你的具体映射规则 cfg.CreateMap<Source, Destination>(); });
特定映射配置(仅针对某组映射生效)
如果只需要给Source到Destination的映射设置过滤规则,可以更精准地配置:
Mapper.Initialize(cfg => { // 只针对Source→Destination的映射添加过滤条件 cfg.AddConditionalObjectMapper() .Where((srcType, destType) => srcType == typeof(Source) && destType == typeof(Destination)) .Where((sourceObj, _) => ((Source)sourceObj).Status != "Invalid"); // 常规的映射配置 cfg.CreateMap<Source, Destination>(); });
这样一来,只要是Source转Destination的映射,AutoMapper都会自动跳过Status为"Invalid"的记录。
另外,如果是用ProjectTo做查询投影的话,直接在查询链里加Where条件过滤就行,和方案一的思路一致。
总之,简单场景选方案一,需要复用规则选方案二,都能满足你的需求~
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

