使用 AutoMapper 的 ProjectTo 的 EF 代码会生成高效的 SQL 吗?
Will EF code with AutoMapper's ProjectTo generate efficient SQL?
以下代码 (.Net Core 3.0) 读取数据库 table 并使用 AutoMapper 从 table.
中获取几列
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);
会不会把数据库table的所有列都读到内存,然后把数据映射到三个属性EmployeeLookupDto
class?或者它实际上会生成一个 SQL with select 三列的子句?
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
,然后实际生成并执行 SQL 代码ToListAsync
方法。
以下代码 (.Net Core 3.0) 读取数据库 table 并使用 AutoMapper 从 table.
中获取几列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);
会不会把数据库table的所有列都读到内存,然后把数据映射到三个属性EmployeeLookupDto
class?或者它实际上会生成一个 SQL with select 三列的子句?
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
,然后实际生成并执行 SQL 代码ToListAsync
方法。