我正在为项目中的视图模型实现自动映射器,而我刚刚开始使用它。我遇到的障碍是Automapper中我不熟悉的一种行为。我现在已经在几个项目上使用了自动映射器,以前没有遇到过这个问题。
基本上在代码中是这样:
var q = dbContext.Orders.Where(x => x.Name == 'name');
var l = q.ToList(); // count == 10
var shared = q.ProjectTo<OrderSharedModel>().ToList(); // count == 0
我发现,当映射一个为null的属性时,它不再映射了,就像它完全跳过了该实体的映射一样。
例如:
class Order {
public int OrderId { get; set; }
public string Name { get; set; }
public int? OrderTypeId { get; set; }
public virtual OrderType { get; set; }
}
class OrderSharedModel {
public int OrderId { get; set; }
public string Name { get; set; }
public OrderTypeSharedModel OrderType { get; set; }
}
如果Order
中的OrderType为null,则将导致ProjectTo<OrderSharedModel>().ToList()
返回一个空列表。如果我在共享模型中注释了OrderType
,则ProjectTo<OrderSharedModel>().ToList()
将返回完整列表。这对我来说很奇怪。
如果ProjectTo()之前的原始查询不为空,为什么ProjectTo<OrderSharedModel>().ToList()
返回空列表?为什么自动映射器不将null属性映射为null而不是完全跳过映射并返回空列表?
-更新-
但是,如果我使用其他方式映射:
var l = q.ToList();
var sm = Mapper.Map<List<Order>, List<OrderSharedModel>>(l);
效果很好。我现在正在这样做,直到我找到可查询扩展名中断的确切原因为止。