C# 将EF代码与AutoMapper';如何生成高效的SQL?

C# 将EF代码与AutoMapper';如何生成高效的SQL?,c#,entity-framework,.net-core,entity-framework-core,automapper,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 .O

下面的代码(.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);
var employees=await\u context.employees//Employee表有很多列
.ProjectTo(_mapper.ConfigurationProvider)//EmployeeLookupDto只有三列
.OrderBy(e=>e.Name)
.ToListSync(取消令牌);

它会将数据库表的所有列读取到内存中,然后将数据映射到三个属性
EmployeeLookupDto
类吗?或者它将实际生成一个包含三列select子句的SQL?

Automapper根本不生成SQL

相反,它以这样的方式生成
IQueryable
实例,您的SQL提供程序(L2S、EF或其他)很可能能够转换为SQL

是的,在您的示例中,生成的SQL将只包含3列和一个
orderby
子句

编辑:
同样,AutoMapper不会生成任何SQL代码

这部分代码:

_context.Employees
    .ProjectTo<EmployeeLookupDto>(_mapper.ConfigurationProvider) 
这也是您的DTO的类型
IQueryable
。汽车制造商的工作在这一点上完成了


在此之后,您的EF核心SQL提供程序就可以将此实例
OrderBy
转换为
IOrderedQueryable
,然后在
ToListAsync
方法中实际生成并执行SQL代码。

是的,它将生成高效的SQL。看见您也可以打开自己查看。检查。一个快速提示-您的ProjectTo通常应该是列表中的最后一个,就像在LINQ Selector中一样。它会影响SQL的生成方式吗?或者它们将具有相同的表达式树,以便生成相同的SQL?“AutoMapper不生成任何SQL”需要位于
标记中。
_context.Employees
    .Select(T => new EmployeeLookupDto
    {
         DtoField1 = T.EmployeeField1,
         DtoField2 = T.EmployeeField2,
         ...
    })