首页 > 解决方案 > EF core 2第一次查询慢

问题描述

我在我的项目中使用 EF core 2 作为 ORM。我在执行这个查询时遇到了这个问题:

 var query = (from droitsGeo in _entities.DroitsGeos
              join building in  _entities.Batiments
              on droitsGeo.IdPerimetre equals building.IdBatiment
              where droitsGeo.IdUtilisateur == idUser &&
              droitsGeo.IdClient == idClient &&
              building.Valide == true &&
              droitsGeo.IdNiveauPerimetre == geographicalLevel
              orderby sort ascending
              select new GeographicalModel
              {
                 Id = building.IdBatiment,
                 IdParent = building.IdEtablissement,
                 Label = building.LibBatiment,
              });

第一次执行大约需要 5 秒,第二次不到一秒,如下所示:

第一次执行查询:

经过时间 EF: 00:00:04.8562419

首次执行查询后:

时间流逝 EF: 00:00:00.5496862

时间流逝 EF: 00:00:00.6658079

时间流逝 EF: 00:00:00.6176030

我使用存储过程有相同的结果。

当我在 SQL Server 中执行 EF 生成的 sql 查询时,不到一秒就返回了结果。

EF Core 2 有什么问题还是我错过了配置中的某些内容?

标签: linqc#-6.0ef-core-2.0

解决方案


默认情况下,EF 会跟踪您对其运行查询的所有实体。

当你第一次运行它时,轨道改变机制就会启动......这就是为什么它需要更长的时间。

您可以避免这种情况,尤其是.AsNoTracking()在编写查询时使用 检索集合时。

看一看:

var items = DbContext.MyDbSet
    .Include(SecondObject)
    .AsNoTracking()
    .ToList();

推荐阅读