C# 实体框架AsNoTracking on table比通过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

我有一种情况,如果我有一个数据库集通过EF链接到一个表,并且我使用LINQ查询它,那么它始终比直接使用存储过程慢,该存储过程已经使用EF的generate model功能链接到数据库中的存储过程

这怎么可能

这是使用AsNoTracking()查询带有EF的表的代码:

这是存储过程:

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);