c# - EF 代码会用 AutoMapper 的 Project 生成高效的 SQL 吗?
问题描述
以下代码(.Net Core 3.0)读取数据库表并使用 AutoMapper 从表中获取几列。
var employees = await _context.Employees // Employee table has a lot of columns
.ProjectTo<EmployeeLookupDto>(_mapper.ConfigurationProvider) // EmployeeLookupDto only has three columns
.OrderBy(e => e.Name)
.ToListAsync(cancellationToken);
会不会将数据库表的所有列读入内存,然后将数据映射到三个属性EmployeeLookupDto
类?或者它实际上会生成一个带有三列选择子句的 SQL?
解决方案
Automapper 根本不生成 SQL。
相反,它IQueryable<T>
以这样一种方式生成实例,即您的 SQL 提供程序(L2S、EF 或其他)很可能能够转换为 SQL。
是的,在您的示例中,生成的 SQL 将仅包含 3 列和一个Order By
子句。
编辑:
同样,AutoMapper 不会生成任何 SQL 代码。
这部分代码:
_context.Employees
.ProjectTo<EmployeeLookupDto>(_mapper.ConfigurationProvider)
(即IQueryable<Employee>
)将转换为以下代码:
_context.Employees
.Select(T => new EmployeeLookupDto
{
DtoField1 = T.EmployeeField1,
DtoField2 = T.EmployeeField2,
...
})
这次又是你的 DTO 的类型IQueryable
。AutoMapper 的工作至此完成。
之后,这完全取决于您的 EF Core SQL 提供程序OrderBy
将此实例导入IOrderedQueryable
,然后在该ToListAsync
方法中实际生成和执行 SQL 代码。
推荐阅读
- python - LXML 在 Windows 10 中既不下载也不绑定
- python - 如何查看/打印保存在变量中但已删除代码的函数?
- json - 无法识别在 csv 文件中存储和使用的 json 请求正文的正确格式,以便在空手道场景中使用
- jquery - 如何在 jQuery 日期选择器中为禁用日期添加工具提示?
- vb.net - Vb.Net 2019 Windows 窗体应用程序无法在表单加载事件中连接到 Openoffice
- javascript - 使用 QuaggaJS 停止后如何启动相机
- d3.js - 在另一个过渡正在进行时开始一个过渡
- angular - 对组件的变化做出反应,避免使用 location.reload()
- powershell - 将输出转换为 CSV 和 Out-Grid
- .net - Tizen 手表表圈交互