自动映射器 - IMongoQueryable Project忽略AllowNullDestinationValues

问题描述 投票:0回答:1

我正在映射源对象

public class PlannedCare
{
    public int OrderNumber { get; set; }
    public PlannedCareBatch? BatchStart { get; set; }
}

public class PlannedCareDto
{
    public int OrderNumber { get; set; }
    public PlannedCareBatchRm? BatchStart { get; set; }
}

配置:

var config = new MapperConfiguration(cfg => {
    cfg.AllowNullDestinationValues = true; //this is default, but just to make sure...
    cfg.CreateMap<PlannedCare, PlannedCareRm>();
    cfg.CreateMap<PlannedCareBatch, PlannedCareBatchRm>();
    // other mappings...
});

如果我使用

Map
方法,一切都可以。当我使用
ProjectTo
时,目标 BatchStart 对象始终会被初始化。如果源属性 BatchStart 为 null,我希望它保持为 null。我正在使用 Mongo DB 驱动程序。问题出在哪里?

public IQueryable<PlannedCareDto> GetQueryable()
{
    return _collection
        .AsQueryable()
        .ProjectTo<PlannedCareDto>(_mapper.ConfigurationProvider);
}

我什至尝试在属性上设置 NullSubstitue,但这也不起作用。我猜查询会出现某种格式错误...

CreateMap<PlannedCare, PlannedCareRm>()
    .ForMember(p => p.BatchStart, d => d.NullSubstitute(null));
c# mongodb automapper
1个回答
0
投票

我发现问题了。

Automapper 表达式没问题:

BatchStart = .If ($dtoPlannedCare.BatchStart == .Default(System.Object)) {
            .Default(Care.Domain.QueryServices.PlannedCare.ReadModels.PlannedCareBatchRm)
        } .Else {
            .New Care.Domain.QueryServices.PlannedCare.ReadModels.PlannedCareBatchRm(){
                BatchId = ($dtoPlannedCare.BatchStart).BatchId,
                Status = ($dtoPlannedCare.BatchStart).Status
            }
        },

Mongo表达:

BatchStart: {
        '$cond': {
          if: { '$eq': ['$BatchStart', null] },
          then: null,
          else: { BatchId: '$BatchStart.BatchId', Status: '$BatchStart.Status' }
        }
      },

Mongo 对不存在属性和空属性的处理方式不同。 如果该属性不存在,

if: { '$eq': ['$BatchStart', null] },
会被评估为 false

© www.soinside.com 2019 - 2024. All rights reserved.