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可解析的投影表达式,兼顾自动映射和服务器端性能:
- 安装NuGet包:
AutoMapper.MongoDB - 修改查询代码:
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
相关产品推荐
相关产品推荐

