【发布时间】:2019-02-04 09:10:06
【问题描述】:
我试图在此 IQueryable 定义中消除对 Include() 调用的使用:
return ctx.timeDomainDataPoints.AsNoTracking()
.Include(dp => dp.timeData)
.Include(dp => dp.RecordValues.Select(rv => rv.RecordKind).Select(rk => rk.RecordAlias).Select(fma => fma.RecordAliasGroup))
.Include(dp => dp.RecordValues.Select(rv => rv.RecordKind).Select(rk => rk.RecordAlias).Select(fma => fma.RecordAliasUnit))
.Where(dp => dp.RecordValues.Any(rv => rv.RecordKind.RecordAlias != null))
.Where(dp => dp.Source == 235235)
.Where(dp => dp.timeData.time >= start && cd.timeData.time <= end)
.OrderByDescending(cd => cd.timeData.time);
我一直遇到运行时间太长的数据库问题,主要原因是 Include() 调用正在拉取所有内容。 这在查看从由此生成的结果 SQL 查询返回的表中很明显,显示了许多不必要的信息被返回。 我猜你学到的一件事。 数据库有大量数据点,其中有许多记录值。 每个 Recorded 值都映射到可能具有 Record Alias 的 Record Kind。
我已经尝试创建一个 Select() 作为替代方案,但我只是不知道如何构造正确的 Select 并保持实体层次结构正确加载。 IE。相关实体加载了对数据库的不必要调用。
有没有人有替代解决方案可以让我开始解决这个问题。
如果需要,我会添加更多细节。
【问题讨论】:
-
您是否包含这些实体是因为您想使用
where过滤它们,还是因为您稍后需要它们的数据?无需include对象即可在同一查询中使用where。 -
事实上@EzLo,我最初的理解(天真地承认)是,即使 wheres 正在过滤信息,我仍然需要获取信息。我在加载信息时添加了 Includes,而不是通过查询向 DB 发送垃圾邮件。我的看法是,每个 timeDomainDataPoint 都与 timeData (1 到 1)连接,然后加入 RecordKinds 映射到 RecordAliases (1 到可选 1)的 RecordValues (多到 1)。所有这些连接信息也都被使用。
标签: c# entity-framework iqueryable