首页 > 解决方案 > 查询不为空时,Automapper 投影返回空列表

问题描述

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

我发现当映射一个为空的属性时,它不再映射,就像它完全跳过了该实体的映射一样。

例如:

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; }
}

如果 OrderType 为空,Order则将导致ProjectTo<OrderSharedModel>().ToList()返回一个空列表。OrderType如果我在共享模型中注释掉,ProjectTo<OrderSharedModel>().ToList()将返回完整列表。这对我来说很奇怪。

如果 ProjectTo() 之前的原始查询不为空,为什么会ProjectTo<OrderSharedModel>().ToList()返回一个空列表?为什么 automapper 不将 null 属性映射为 null 而不是完全跳过映射并返回一个空列表?

- 更新 -

但是,如果我使用其他方式映射:

var l = q.ToList();
var sm = Mapper.Map<List<Order>, List<OrderSharedModel>>(l);

它工作得很好。我现在正在这样做,直到我确切地找到可查询扩展名中断的原因。

标签: c#automapper

解决方案


刚刚遇到同样的问题,dto 的内部属性为空,并且由于某种原因它不在结果列表中。我从 AutoMapper 8.1 升级到 9.0,现在可以正常工作了。


推荐阅读