c# - 任何改进此 EF 查询的方法
问题描述
在第三方使用的 WebApi 中,今天我们开始在他们调用方法时遇到故障。
该方法连接到几个表并将它们连接起来。来自 EF 的错误消息是
查询处理器用尽了内部资源,无法生成查询计划。这是一个罕见的事件,仅适用于极其复杂的查询或引用大量表或分区的查询。请简化查询。如果您认为您错误地收到了此消息,请联系客户支持服务以获取更多信息。
return context.leads
.Where(q => q.eventID == 1234)
.Join(context.config,
leads => leads.configId,
config => config.configId,
(leads, config) => new { leads, config })
.Where(p => keys.Contains(p.leads.leadId))
keys 是检索到的潜在客户 ID 的 IEnumerable。基本上,我们提取 id 列表,然后执行上述操作,检查键集合,以便我们的查询返回准确的数据。
密钥拥有大约 28k 个 ID。
请注意,自从迁移到 Azure 云后,这才开始成为一个问题,但我认为这是一个巧合
解决方案
keys 是检索到的潜在客户 ID 的 IEnumerable。
密钥拥有大约 28k 个 ID。
所以这:
return context.leads
.Where(q => q.eventID == 1234)
.Join(context.config,
leads => leads.configId,
config => config.configId,
(leads, config) => new { leads, config })
.Where(p => keys.Contains(p.leads.leadId))
将 ID 粘贴到 SQL 查询文本中,例如:
SELECT … WHERE LeadId in (1,23,3,4,5,6,45,34, . . . )
导致大型、不可重用和昂贵的解析和编译查询。最好将 ID 加载到表中并加入它们,或者使用 XML、JSON 或表值参数将它们传递到服务器。
基本上我们提取 id 列表,然后我们执行上述操作
然后不要那样做。如果您想要的 ID 列表在数据库中,则将其加入您的查询中。避免从数据库中读取 28K ID,然后将它们发送回您的查询正文。
推荐阅读
- intellij-idea - IntelliJ 2020 更新更改字体
- flutter - 如何使用颤振将文件发送到 node.js 服务器?
- scala - 原因:java.lang.IllegalArgumentException: Can't get JDBC type for null
- python - 将 pandas 数据框与对象合并
- typescript - 环境打字稿定义未捆绑在库中
- c++ - 3DES EDE ECB Enryption - c++ 输出不同于 JAVA 默认模式输出
- vue.js - 如何在 Nuxt.js 中使用 CKEditor - 未定义窗口错误
- vue.js - 使用 v-for 时如何将 Vue 道具传递给子组件?
- powershell - 有没有办法在powershell中记录日志文件中的更改?
- javascript - 收集对象中的相同项目