You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:14:16