gpt4 book ai didi

c# - 使用 Entity Framework 加载子实体时性能不佳

转载 作者:行者123 更新时间:2023-11-30 22:24:41 25 4
gpt4 key购买 nike

我正在使用 Entity Framework (代码优先)构建一个 ASP.Net 应用程序,并且我已经实现了一个存储库模式 like the one in this example .

我的数据库中只有两个表。一种称为 Sensor,另一种称为 MeasurePoint(仅包含 TimeStampValue)。一个传感器可以有多个测量点。目前我有 5 个传感器和大约 15000 个测量点(每个传感器大约 3000 个点)。

在我的一个 MVC Controller 中,我执行以下行(以获取传感器的最新 MeasurePoint)

DbSet<Sensor> dbSet = context.Set<Sensor>();
var sensor = dbSet.Find(sensorId);
var point = sensor.MeasurePoints.OrderByDescending(measurePoint => measurePoint.TimeStamp).First();

这个调用需要大约 1 秒的时间来执行,这对我来说感觉很长。以下 SQL 查询的调用结果

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)

这只需要大约 200 毫秒的时间来执行,所以时间花在了其他地方。

我在 Visual Studio Profiler 的帮助下分析了代码,发现导致延迟的调用是

System.Data.Objects.Internal.LazyLoadBehavior.<>c_DisplayClass7`2.<GetInterceptorDelegate>b_1(!0,!1)

所以我猜它与延迟加载有关。我必须忍受这样的表现还是我可以做出改进?是按时间排序导致性能下降吗?如果是,我有什么选择?

更新:我更新了代码以显示 sensor 的来源。

最佳答案

这样做是将整个子集合加载到内存中,然后对加载的(appx 3000)子集合执行 .First() linq 查询。

如果您只想要最新的,请改用它:

context.MeasurePoints.OrderByDescending(measurePoint => measurePoint.TimeStamp).First();

关于c# - 使用 Entity Framework 加载子实体时性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com