Linq EF核心2第一查询速度慢
我在我的项目中使用EFCore2作为ORM。 我在执行此查询时遇到了此问题: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
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仅将相关属性映射到其他类。请注意,我并没有给您提供如何使用存储过程的教程。我给你举一个例子,也许可以更好地解释:
SP_Result.cs
的模型类,以映射存储过程的接收对象(在EF Core中使用存储过程时需要这样做)CreateMap();CreateMap()代码>。我想,您将拥有一个可以代替ViewModels使用的请求和响应对象。在存储过程中使用作为
关键字相应地命名属性。e、 g.选择标准名称作为“名称”
如果要选择一个对象列表,其中每个对象都有自己的对象列表,则此场景通常会在EF中创建N+1查询。事实上,如果您试图使用存储过程来实现这一点,则必须创建多个查询或多次运行存储过程(可能是在循环中),否则最终将收到笛卡尔积。我在这篇文章中读到,返回匿名类型,EF不做卡车运输,但我的结果是相同的,当我返回匿名用户类型或添加.AsNoTracking()时,问题来自EF,需要几秒钟的时间编译模型,下面是我试图通过在startup.cs中添加查询来编译模型的讨论,它为我节省2到3秒,希望它能帮助某人!如何在startup.cs中添加查询?我似乎找不到任何例子!有解决办法吗?对于EF堆芯慢度第一个请求