下面的代码(.Net Core 3.0)读取数据库表,并使用AutoMapper从表中获取一些列。
var employees = await _context.Employees // Employee table has a lot of columns .ProjectTo(_mapper.ConfigurationProvider) // EmployeeLookupDto only has three columns .OrderBy(e => e.Name) .ToListAsync(cancellationToken);
它将数据库表的所有列读取到内存,然后将数据映射到三个属性EmployeeLookupDto
类吗?还是实际上会生成带有三列select子句的SQL?
Automapper根本不生成SQL。
相反,它IQueryable
以这样的方式生成实例,即您的SQL提供程序(L2S,EF或其他)很可能将其转换为SQL。
是的,在您的示例中,生成的SQL仅包含3列和一个Order By
子句。
同样,AutoMapper不会生成任何SQL代码。
您的代码的这一部分:
_context.Employees .ProjectTo(_mapper.ConfigurationProvider)
(即IQueryable
)将被转换为以下代码:
_context.Employees .Select(T => new EmployeeLookupDto { DtoField1 = T.EmployeeField1, DtoField2 = T.EmployeeField2, ... })
这次又是IQueryable
DTO 类型的。此时,AutoMapper的工作已完成。
之后,一切由您的EF Core SQL提供程序OrderBy
将此实例插入IOrderedQueryable
,然后实际在该ToListAsync
方法中生成并执行SQL代码。