即使 SQL 生成速度很快,实体框架也会随着添加额外连接而逐渐变慢

San*_*ker 5 c# linq sql-server performance entity-framework

我们有 18 个表连接,这是 ERP 系统的典型特征。联接是通过实体框架上的 LINQ 完成的。

随着添加更多连接,连接逐渐变慢。返回结果集很小(15 条记录)。LINQ 生成的查询是通过 SQL Profiler 捕获的,当我们通过 Microsoft 管理控制台运行它时,速度非常快:10 毫秒。当我们通过我们的 C# LINQ-over-EntityFramework 运行它时,它需要 4 秒。

我猜正在发生的事情:将表达式树编译成 SQL 所需的时间是总共 4 秒中的 2 秒,另外 2 秒我猜是在内部将 SQL 结果集转换为实际的 C# 类。它也没有连接到实体框架的初始化,因为我们之前运行了一些查询,并且对这个连接的重复调用产生了相同的 4 秒。

有没有办法加快这个速度。否则我们正在考虑放弃实体框架,因为它绝对是低效的......

Avr*_*oel 3

如果它有帮助的话,我遇到了一个严重的性能问题,在原始 SQL 中花费 1-2 秒的简单查询通过 EF 花费了大约 11 秒。

我从使用...

List<GeographicalLocation> geographicalLocations = new SalesTrackerCRMEntities()
  .CreateObjectSet<GeographicalLocation>()
  .Where(g => g.Active)
  .ToList();
Run Code Online (Sandbox Code Playgroud)

通过 EF 大约花费了 11 秒,然后使用...

var geographicalLocations = getContext().CreateObjectSet<GeographicalLocation>()
    .AsNoTracking()
    .Where(g => g.Active).ToList();
Run Code Online (Sandbox Code Playgroud)

整个过程花费了不到 200毫秒

这样做的缺点是它不会加载相关实体,因此您必须随后手动加载它们,但它提供了如此巨大的性能提升,以至于非常值得(至少在这种情况下)。

您必须单独评估每种情况,看看额外的速度是否值得额外的代码。