C# 使用实体框架加载子实体时性能不佳
我正在用实体框架(代码优先)构建一个ASP.Net应用程序,并实现了一个存储库模式 我的数据库中只有两个表。一个称为C# 使用实体框架加载子实体时性能不佳,c#,asp.net,linq,entity-framework,C#,Asp.net,Linq,Entity Framework,我正在用实体框架(代码优先)构建一个ASP.Net应用程序,并实现了一个存储库模式 我的数据库中只有两个表。一个称为传感器,另一个称为测量点(仅包含时间戳和值)。传感器可以有多个测量点。目前,我有5个传感器和大约15000个测量点(每个传感器大约3000个点) 在我的一个MVC控制器中,我执行以下命令(获取传感器的最新测量点) 只需约200毫秒即可执行,因此时间会花在其他地方 我在VisualStudioProfiler的帮助下分析了代码,发现导致延迟的调用是 System.Data.Objec
传感器
,另一个称为测量点
(仅包含时间戳
和值
)。传感器可以有多个测量点。目前,我有5个传感器和大约15000个测量点(每个传感器大约3000个点)
在我的一个MVC控制器中,我执行以下命令(获取传感器的最新测量点)
只需约200毫秒即可执行,因此时间会花在其他地方
我在VisualStudioProfiler的帮助下分析了代码,发现导致延迟的调用是
System.Data.Objects.Internal.LazyLoadBehavior.<>c_DisplayClass7`2.<GetInterceptorDelegate>b_1(!0,!1)
System.Data.Objects.Internal.LazyLoadBehavior.c_DisplayClass7`2.b_1(!0,!1)
所以我想这与延迟加载有关。我是否必须接受这样的表现,或者我是否可以做出改进?是按时间排序导致性能下降吗?如果是,我有什么选择
更新:
我已经更新了代码以显示传感器的来源 如果该查询正在运行,则会将所有3000个点加载到传感器的内存中。尝试直接在DbContext上运行查询,而不是使用navigation属性,然后查看性能差异。您的开销可能来自不需要加载的2999个点。这样做的目的是将整个子集合加载到内存中,然后对加载的(appx 3000)子集合执行.First()linq查询 如果您只想要最新的,请使用以下选项:
context.MeasurePoints.OrderByDescending(measurePoint=>measurePoint.TimeStamp).First()代码>这是仅第一次调用的执行时间吗?什么类型的“传感器”对象?它是DbContext
?不是,它是从DbContext
中提取的Sensor
对象。我更新了我的问题以反映这一点谢谢。这要快得多。
SELECT
[Extent1].[MeasurePointId] AS [MeasurePointId],
[Extent1].[Value] AS [Value],
[Extent1].[TimeStamp] AS [TimeStamp],
[Extent1].[Sensor_SensorId] AS [Sensor_SensorId]
FROM [dbo].[MeasurePoint] AS [Extent1]
WHERE ([Extent1].[Sensor_SensorId] IS NOT NULL) AND ([Extent1].[Sensor_SensorId] = @EntityKeyValue1)
System.Data.Objects.Internal.LazyLoadBehavior.<>c_DisplayClass7`2.<GetInterceptorDelegate>b_1(!0,!1)