C# 实体框架AsNoTracking on table比通过EF直接调用存储过程更快
我有一种情况,如果我有一个数据库集通过EF链接到一个表,并且我使用LINQ查询它,那么它始终比直接使用存储过程慢,该存储过程已经使用EF的generate model功能链接到数据库中的存储过程 这怎么可能 这是使用AsNoTracking()查询带有EF的表的代码: 这是存储过程:C# 实体框架AsNoTracking on table比通过EF直接调用存储过程更快,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我有一种情况,如果我有一个数据库集通过EF链接到一个表,并且我使用LINQ查询它,那么它始终比直接使用存储过程慢,该存储过程已经使用EF的generate model功能链接到数据库中的存储过程 这怎么可能 这是使用AsNoTracking()查询带有EF的表的代码: 这是存储过程: SELECT Forecasts.* FROM Forecasts WHERE Forecasts.Year = @PreviousYear AND Forecasts.ParcelId IN (SELECT
SELECT Forecasts.*
FROM Forecasts
WHERE Forecasts.Year = @PreviousYear
AND Forecasts.ParcelId IN (SELECT Parcel.Id
FROM Parcel
INNER JOIN Geometry ON Parcel.GeometryId = Geometry .Id
WHERE Parcel.Flag = 0
AND Parcel.Id != @ParcelId
AND Geometry.CentroidPoint.STIntersects(@NearbyGeometry.STBuffer(@Buffer)) = 1
AND Parcel.Id IN (SELECT Forecasts.ParcelId
FROM Forecasts
WHERE Forecasts.Year = @FinalYear
AND (Forecasts.Area1Id = @MainArea
OR Forecasts.Area2Id = @MainArea)
这就是它的名称:
var relatedParcels = db.RelatedParcels(parcelId, buffer, geometry, finalYear, mainArea, previousYear).GroupBy(x => x.parcelId);
直接到表的LINQ查询始终比直接调用存储过程快3倍
我正在使用.NETFramework4.7.2和EF6
TLDR:EF怎么可能比存储过程快?您是否尝试过在没有
GroupBy
的情况下调用SP,比如db.RelatedParcels(parcelId、buffer、geometry、finalYear、mainArea、上一年)代码>?这会改变什么吗?在以一种有意义的方式进行测试之前,不需要讨论哪个更快以及为什么更快,并且一致地比较like和like。这不是一个EF问题,而是EF生成的查询和您的比较存储过程之间的差异。要获得差异的解释,请查看查询和存储过程的执行计划。AsNoTracking()并没有使查询运行得更快,它只是避免了EF DbContext解析实体并将其加载到缓存中所需的额外时间。
var relatedParcels = db.RelatedParcels(parcelId, buffer, geometry, finalYear, mainArea, previousYear).GroupBy(x => x.parcelId);