首页 > 解决方案 > 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?

标签: c#entity-framework.net-coreentity-framework-coreautomapper

解决方案


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 代码。


推荐阅读