【问题标题】:Entity Framework Related Entity too much load time实体框架相关实体加载时间过多
【发布时间】:2014-02-26 13:43:22
【问题描述】:

我正在使用 MVC5 和 EF6 来开发应用程序。我将 SQL Server Express 用于数据库。我在数据库中有两个表/实体。

Vehicle - 包含有关车辆的信息

GsmDeviceLog - 包含从 GPS Tracker Fit 接收到的数据。

我的 GsmDeviceLogs 表目前有大约 20K 条记录,执行以下代码大约需要 90 秒。仅获取一条记录(即最后一条记录)。

代码如下:

var dlog = db.Vehicles.Find(2).GsmDeviceLogs.LastOrDefault();

当我尝试使用服务器资源管理器打开表时,它会在 5-10 秒内显示所有数据。谁能帮我在页面上快速加载详细信息。

感谢您阅读并关注该问题。 任何人都可以提出任何减少时间的方法。

【问题讨论】:

  • Find 返回的是什么? IQueryableIEnumerable ?
  • 车辆类型的 DbSet。
  • 我认为你的代码是从表中提取所有记录,然后在客户端,进行降序排序,给你第一行。运行该特定行后,您能否查看内存使用量是否显着增加?

标签: entity-framework model-view-controller


【解决方案1】:

您的查询应如下所示:

var dlog = db.Vehicles
    .Where(v => v.Id == 2)
    .SelectMany(v => v.GsmDeviceLogs)
    .OrderByDescending(gdl => gdl.Id) // or order by some datetime
    .FirstOrDefault();

在您的原始查询中,您正在使用Find 加载Vehicle。然后访问 GsmDeviceLogs 集合通过延迟加载将该车辆的 all 日志加载到内存中,然后从内存中加载的集合中选择最后一个。可能是所有日志的加载都比较耗时。

上面的查询完全在数据库中执行,只返回一条GsmDeviceLog记录。旁注:您必须在此处使用 OrderByDescending(...).FirstOrDefault,因为 LINQ to Entities 不支持 LastOrDefault

【讨论】:

  • 它在 OrderByDescending 行中给出了编译错误。它不能将 gdl 识别为 GsmDeviceLog 类型。
  • @AshishCharan:.Id 可能是问题所在吗?您必须用GsmDeviceLog 实体的正确键替换它。
  • 否。我尝试使用 TimeOfLog 字段对其进行排序。但它不承认这一点。
  • @AshishCharan:啊,抱歉,您必须将Select 替换为SelectMany,请参阅上面我编辑的代码。
  • 适用于编辑。 Lemme 检查加载时间。另外,导航不可能吗?特性。应该只有一个人来。?
【解决方案2】:

您的 Linq 查询效率低下。尝试做db.Vehicles.Single( x => x.Id).GsmDeviceLogs.OrderByDescending(x => x.Id).FirstOrDefault() 或任何你的主键

【讨论】:

  • 结果相同。
  • 那么你应该看看你的 SQL 布局。 20k 条记录需要 90 秒。
  • 但是它在服务器资源管理器中打开它非常快。我不明白原因。
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多