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

MongoDB投影使用AutoMapper报错:Expression not supported

解决MongoDB Driver投影时AutoMapper Map方法不支持的问题

问题原因

MongoDB .NET Driver的Projection.Expression要求传入的表达式能被转换为MongoDB原生查询语言,而AutoMapper的Map方法是客户端内存中的映射逻辑,无法被驱动解析为数据库端的投影操作,因此抛出Expression not supported: value(AutoMapper.Mapper).Map(m)错误。

解决方案

方案1:客户端查询后映射(最简单)

先从数据库查询完整的实体对象,再在客户端用AutoMapper映射为DTO。适合数据量较小的场景:

public async Task<IEnumerable<MachineOperationDto>?> Teste()
{
    // 注意:确保实体类型与集合泛型一致,此处应为MachineOperationModel
    var entities = await _collection
        .Find(Builders<MachineOperationModel>.Filter.Empty)
        .ToListAsync();
    
    return _mapper.Map<IEnumerable<MachineOperationDto>>(entities);
}

方案2:手动构建MongoDB服务器端投影

直接通过MongoDB Driver构建投影,只拉取DTO需要的字段,性能最优。需确保DTO属性名与实体类对应:

public async Task<IEnumerable<MachineOperationDto>?> Teste()
{
    var projection = Builders<MachineOperationModel>.Projection
        .Include(m => m.Id)
        .Include(m => m.StartTime)
        .Include(m => m.EndTime);

    var teste2 = await _collection
        .Find(Builders<MachineOperationModel>.Filter.Empty)
        .Project<MachineOperationDto>(projection)
        .ToListAsync();
    
    return teste2;
}

方案3:使用AutoMapper.MongoDB扩展实现服务器端投影

通过AutoMapper官方MongoDB扩展包,让AutoMapper自动生成MongoDB可解析的投影表达式,兼顾自动映射和服务器端性能:

  1. 安装NuGet包:AutoMapper.MongoDB
  2. 修改查询代码:
public async Task<IEnumerable<MachineOperationDto>?> Teste()
{
    var teste2 = await _collection
        .Find(Builders<MachineOperationModel>.Filter.Empty)
        .ProjectTo<MachineOperationDto>(_mapper.ConfigurationProvider)
        .ToListAsync();
    
    return teste2;
}

关键修正

检查映射配置与实体类型是否匹配:你的实体类是MachineOperationModel,但原映射代码用了MachineOperation,需修正为:

private void MachineOperationMap()
{
    CreateMap<MachineOperationModel, MachineOperationDto>()
        .ReverseMap();
}

内容的提问来源于stack exchange,提问作者guirms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:43:36