我正在映射源对象
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));
我发现问题了。
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。