Linq EF核心2第一查询速度慢

Linq EF核心2第一查询速度慢,linq,c#-6.0,ef-core-2.0,Linq,C# 6.0,Ef Core 2.0,我在我的项目中使用EFCore2作为ORM。 我在执行此查询时遇到了此问题: var query = (from droitsGeo in _entities.DroitsGeos join building in _entities.Batiments on droitsGeo.IdPerimetre equals building.IdBatiment where droitsGeo.IdUtilisat

我在我的项目中使用EFCore2作为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秒,第二次执行不到1秒,如下所示:

第一次执行查询:

经过的时间EF:00:00:04.8562419

第一次执行查询后:

经过的时间EF:00:00:00.5496862

经过的时间EF:00:00:00.6658079

经过的时间EF:00:00:00.6176030

我使用存储过程得到了相同的结果

当我在SQLServer中执行EF生成的sql查询时,结果会在不到一秒钟的时间内返回


EF Core 2有什么问题,或者我在配置中遗漏了什么?

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

当你第一次运行它的时候,轨道改变机制开始起作用了。。。这就是为什么要花更长的时间

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

看一看:

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

EF core需要使用反射编译LINQ请求,因为第一个查询总是很慢。已经有一个GitHub问题了

我有一个简单的想法,可以借助存储过程和AutoMapper来解决这个问题

创建一个存储过程,以返回所需的所有列,无论它们是否来自不同的表。一旦从存储过程接收到数据,并且您在一个模型类中接收到对象,您就可以使用AutoMapper仅将相关属性映射到其他类。请注意,我并没有给您提供如何使用存储过程的教程。我给你举一个例子,也许可以更好地解释:

  • 创建了一个存储过程,它返回来自三个名为A、B和C的表的结果

  • 与创建的存储过程相对应,创建了一个名为
    SP_Result.cs
    的模型类,以映射存储过程的接收对象(在EF Core中使用存储过程时需要这样做)

  • 创建的“ViewModels”具有与从每个表A、B和C返回的属性相同的属性

  • 此后,将使用A类、B类和C类的ViewModel为SP_结果创建映射配置。例如
    CreateMap();CreateMap()。我想,您将拥有一个可以代替ViewModels使用的请求和响应对象。在存储过程中使用
    作为
    关键字相应地命名属性。e、 g.
    选择标准名称作为“名称”

  • 此映射将单个属性映射到每个类。AutoMapper忽略映射配置中提到的任何一个类中都不存在的属性


    如果要选择一个对象列表,其中每个对象都有自己的对象列表,则此场景通常会在EF中创建N+1查询。事实上,如果您试图使用存储过程来实现这一点,则必须创建多个查询或多次运行存储过程(可能是在循环中),否则最终将收到笛卡尔积。

    我在这篇文章中读到,返回匿名类型,EF不做卡车运输,但我的结果是相同的,当我返回匿名用户类型或添加.AsNoTracking()时,问题来自EF,需要几秒钟的时间编译模型,下面是我试图通过在startup.cs中添加查询来编译模型的讨论,它为我节省2到3秒,希望它能帮助某人!如何在startup.cs中添加查询?我似乎找不到任何例子!有解决办法吗?对于EF堆芯慢度第一个请求