C# 如何减少在.net中将结果或查询映射到sql的时间?

C# 如何减少在.net中将结果或查询映射到sql的时间?,c#,entity-framework,.net-core,C#,Entity Framework,.net Core,我正在从angular js调用.net中的函数,从.net获取angular响应所需的时间超过5秒。如何使sql查询结果的映射时间缩短,我有以下代码 List<CarDTO> result = new List<CarDTO>(); var cars = await _carsUnitOfWork.CarRepository.GetCarDefault(carFilter,true,_options.Value.priorityLabel); result = cars

我正在从angular js调用.net中的函数,从.net获取angular响应所需的时间超过5秒。如何使sql查询结果的映射时间缩短,我有以下代码

List<CarDTO> result = new List<CarDTO>();
var cars = await _carsUnitOfWork.CarRepository.GetCarDefault(carFilter,true,_options.Value.priorityLabel);
result = cars.Select(car => _mapper.Map<Car, CarDTO>(car)).ToList();
列表结果=新列表();
var cars=wait _carsUnitOfWork.CarRepository.GetCarDefault(carFilter,true,_options.Value.priorityLabel);
结果=cars.Select(car=>_mapper.Map(car)).ToList();

您提供的代码没有扩展到足以确定原因,但有一些线索:

检查/发布
CareRepository.GetCarDefault()
的代码。该调用意味着它正在返回一个IEnumerable,因为它正在等待。目前还不清楚所有参数是什么,以及它们如何影响查询。随着数据库的增长,这似乎会返回所有汽车,而不支持分页。(当您有10000个或1000000个汽车记录时会发生什么情况?)

接下来是使用Automapper的
Map
方法。与
IEnumerable
相结合,这意味着您的存储库正在经历将所有Care实体加载到内存中的麻烦,然后Automapper正在将一组重复的DTO分配到内存中,跨实体复制数据

对于这样的方法,延迟加载是一个明显的风险。如果CarDTO从汽车引用的实体中提取任何字段,这将触发每个汽车的附加查询

为了获得最佳性能,我强烈建议在存储库方法上采用
IQueryable
返回类型,并利用Automapper的
ProjectTo
方法,而不是
Map
。这相当于在Linq中使用
Select
,因为
ProjectTo
将进入SQL生成,以构建高效查询并返回DTO集合。这消除了延迟加载调用的风险,以及实体(然后是DTO)的双重内存分配

在没有看到代码的情况下,用工作单元模式实现这一点有点未知。但是,它看起来更像:

var result = await _carsUnitOfWork.CarRepository
    .GetCarDefault(carFilter,true,_options.Value.priorityLabel)
    .ProjectTo<CarDto>(mapperConfig)
    .ToListAsync(); // Add Skip() and Take() to support pagination.

关键的区别在于,在现有方法可能返回
ToListAsync()
的地方,我们删除它并返回Linq正在构建的未实现的
IQueryable
。此外,如果当前实现急于加载任何关系/w
.Include()
,我们将排除这些关系。执行投影的调用方不需要这样做。如果调用者确实需要汽车实体图(例如在更新数据时),调用者可以附加
.Include()
语句

还值得运行SQL探查器来查看针对数据库服务器运行的查询。这可以为您提供要检查和测试的查询,并突出显示正在触发的任何意外查询。(即由延迟加载调用引起)


这应该会给你一些关于从哪里开始的想法。

你衡量过你的代码的哪一部分占用了大部分时间吗?显然,在映射结果时,这正是我发布的代码片段。因为如果我大摇大摆地直接查询,时间不到1秒。@josejuanriveragarcia类中映射的字段是什么?可能会尝试逐个字段手动映射它们,看看是映射程序本身还是字段导致延迟。您采取了哪些措施来查明性能不佳的确切原因?在您展示的代码片段中,没有任何东西看起来是针对性能而设计的。您是否已经了解了许多可以找到指南的方法来调查应用程序的性能?由于缺乏细节,我们没有什么可以继续下去的。
public async IEnumerable<Car> GetCarDefault( ... )
public IQueryable<Car> GetCarDefault( ... )
var result = _context.Cars.Include().Where(x => ...).ToListAsync();
return result;
var query = _context.Cars.Where(x => ....);
return query;