使用 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的所有列都读到内存,然后把数据映射到三个属性EmployeeLookupDtoclass?或者它实际上会生成一个 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 方法。