c# - 查询不为空时,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);
它工作得很好。我现在正在这样做,直到我确切地找到可查询扩展名中断的原因。
解决方案
刚刚遇到同样的问题,dto 的内部属性为空,并且由于某种原因它不在结果列表中。我从 AutoMapper 8.1 升级到 9.0,现在可以正常工作了。
推荐阅读
- git - 将弹性 beanstalk 配置复制到另一个区域的环境中
- javascript - 当我点击不同的图像时隐藏 div
- ruby-on-rails - 减少日志记录 Rails 5
- django - Django 使用每页还是每会话 CSRF?
- postman - 在 Newman 中运行一个系列
- android - 在android中默认谷歌的材料日期范围选择器中禁用日期范围选择器中的未来日期选择?
- c# - C# 中的本地 _ 是什么意思?
- adobe-premiere - 导入的视频调用标题不流畅
- flutter - 如何调整行颤动中图标的填充/大小
- javascript - 如何为元素jquery动态编号数据属性?