EF代码可以与AutoMapper的Project一起生成高效的SQL吗?

时间:2019-11-14 16:10:02

标签: c# entity-framework .net-core entity-framework-core automapper

以下代码(.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?

1 个答案:

答案 0 :(得分:5)

Automapper根本不生成SQL。

相反,它以这种方式生成ParseUser.getCurrentUser().get("customFieldKey")实例,以使您的SQL提供程序(L2S,EF或其他)很可能能够转换为SQL。

是的,在您的示例中,生成的SQL仅包含3列和一个IQueryable<T>子句。

编辑:

同样,AutoMapper不会生成任何SQL代码。

这部分代码:

Order By

(即_context.Employees .ProjectTo<EmployeeLookupDto>(_mapper.ConfigurationProvider) )将转换为以下代码:

IQueryable<Employee>

再次,这一次是您的DTO的类型_context.Employees .Select(T => new EmployeeLookupDto { DtoField1 = T.EmployeeField1, DtoField2 = T.EmployeeField2, ... }) 。此时,AutoMapper的工作已经完成。

此后,由您的EF Core SQL提供程序将这个实例IQueryable插入OrderBy,然后实际上在IOrderedQueryable方法中生成并执行SQL代码。