查询不为空时,自动映射器投影将返回空列表

时间:2018-08-07 00:20:04

标签: c# automapper

我正在为项目中的视图模型实现自动映射器,而我刚刚开始使用它。我遇到的障碍是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);

效果很好。我现在正在这样做,直到我找到可查询扩展名中断的确切原因为止。

0 个答案:

没有答案