如何优化 EF Code First 查询?

2023-12-22

[已更新 - 请参阅底部的更新]

我使用 EF 代码优先,并且总体上对此感到满意。然而,一个简单(且常见)的操作导致 EF 生成极其复杂的 SQL,这降低了我的应用程序的速度。

我只是使用(整数)ID 列表来获取一组实体,但因为我需要大量子实体的详细信息,所以我使用.Include()让这些子实体同时加载,如下:

db.MyEntities
    .Where(x => x.ClientId == clientId)
    .Where(x => ids.Contains(x.Id))
    .Where(x => x.SubEntity1 != null)
    .Include(x => x.SubEntity1)
    .Include(x => x.SubEntity1.SubSubEntity1)
    .Include(x => x.SubEntity1.SubSubEntity2)
    .Include(x => x.SubEntity1.SubSubEntity3)
    .Include(x => x.SubEntity1.SubSubEntity4)
    .Include(x => x.SubEntity2)
    .Include(x => x.SubEntity2.SubSubEntity1)
    .Include(x => x.SubEntity2.SubSubEntity2)
    .Include(x => x.SubEntity2.SubSubEntity3)
    .Include(x => x.SubEntity2.SubSubEntity4)
    .Include(x => x.SubEntity3)

正如您所看到的,除了所有这些之外,这并不是一个特别复杂的查询Includes.

EF 为此生成的 SQL 是huge- 大约74KbSQL 的。执行时间不会很长(因为通常 ID 列表中的项目数量很少),但需要 EF构建查询需要花费超过一秒的时间- 即在查询被发送到数据库之前。

如果我删除Includes,那么查询就会小得多,整个过程花费的时间也少得多 - 但每次都会加载各种相关实体,这不能很好地扩展。

EF 似乎为我提供了两种加载数据的选项:

  1. 在初始查询期间一次加载所有子实体(使用Include如上所述),或
  2. 一次加载一个子实体(使用延迟加载,或显式使用Load/LoadProperty).

如果可行的话,选项 1 将是我的首选选项,但由于在这种情况下不起作用,我唯一剩下的选项是 2 - 我认为这是不可接受的:会有太多数据库查询,其中输入列表为ID(即实体的数量)很大。

在我看来,EF 似乎没有解决另一个选项:获取主要实体后,获取所有相关的 SubEntity1 实体,然后获取所有相关的 SubEntity2 实体,等等。这样,查询的数量与的数量types要获取的实体的数量,而不是实体的数量。这会扩展得更好。

我看不到在 EF 中执行此操作的方法:换句话说,就是说“为所有这些实体加载此属性(在单个查询中)”。

我是否必须放弃 EF 并编写自己的 SQL?


UPDATE我注意到即使我删除了Includes,生成的 SQL 比我想象的更复杂,我认为这一切都源于 EF 不“喜欢”我的表结构。我花了好几天的时间才让 EF 通过 Code First(和 Fluent API)创建我正在寻找的数据库结构,即使我已经(几乎)达到了我想要的目标,我也不得不接受一些妥协。

我想我现在要为敢于做 EF 不希望我做的事情而付出进一步的惩罚。看起来一个简单的查询比应有的更复杂,而稍微复杂的查询则复杂得多。

这是令人难以置信的沮丧 - 我以为我已经把所有这些 EF 麻烦抛在脑后,而该系统现在已经投入生产,有数十个用户 - 这将使我很难重新开始。

看来我得花上一辈子的时间与 EF 拼尽全力地战斗。我多么希望我一开始就没有使用过它!

不管怎样,回到我原来的问题:如果我有一堆 A 类型的实体,我想为其加载 B 类型的相关子实体在一个查询中, 有没有办法做到这一点?


使用存储过程加载数据怎么样?是的,这有点脏,但这就是我在 EF 遇到性能问题时所做的。我希望我在你的问题中没有漏掉一些东西。

http://msdn.microsoft.com/en-US/data/jj691402 http://msdn.microsoft.com/en-US/data/jj691402

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优化 EF Code First 查询? 的相关文章

  • EF6 找不到 LocalDBConnectionFactory

    我有 2 个项目 类库 作为 DAL 层 和 ASP NET MVC 项目 作为 UI 为了获取数据 我尝试使用 EF6 但它不起作用 所有异常文本 EntityFramework dll 中发生 System InvalidOperati
  • 如何使实体框架存储过程异步?

    我有一个函数 ReturnStatementDetailsForSubRepAsync 它使用一个 linq 表达式 我可以使用内置函数轻松地使其异步 例如 ToListAsync 现在 因为此 LINQ 函数是异步的 所以我必须使父函数异
  • 如何在 MVC4 的 UserProfile 中创建自定义附加字段

    我遇到了新的 ASP MVC 4 功能 它附带了新的成员资格数据库模式和新的初始化 在 mvc 3 和旧版本中 开发人员能够使用 web config 中的规范创建自定义用户配置文件字段 但现在我面临默认 mvc 4 项目中过滤器命名空间中
  • WPF TreeView 绑定[重复]

    这个问题在这里已经有答案了 我有一个带有父级和子级属性的课程 ADO NET 实体框架分层页面类 http img148 imageshack us img148 6802 edmxxe8 gif http img148 imageshac
  • 同时使用实体框架与 SQL Server 和 SQLite 数据库

    我有一个用于测试目的的 C Net 4 0 控制台应用程序 使用 VS 2012 我的目标是能够创建一个可在 MS SQL Server 数据库和 SQLite 数据库上使用的单个实体框架 edmx 文件 基本上 我想使用相同的实体模型类和
  • 如何将 mvc-mini-profiler 与 Entity Framework 4.1 一起使用

    我尝试将 mvc mini profiler 与 MVC3 一起使用 但不断收到以下错误 无法确定 MvcMiniProfiler Data ProfiledDbConnection 类型连接的提供程序名称 下面是我用来尝试实例化上下文的代
  • .NET 实体框架核心

    我已经阅读了过去两年中发布的几乎所有有关 EF 的其他问题 我下载其他软件包没有任何问题 只是实体框架不会为我安装 我什至尝试安装最新版本的 Nuget 并在我的项目目录中使用它的工具来恢复包 之后 我将这一行添加到我的 csproj 中
  • 包括过滤器子集合[重复]

    这个问题在这里已经有答案了 我在为 LINQ 查询中包含的项目添加一些过滤条件时遇到一些困难 我的查询就像 var item Context Order Include Inner Include Inner first Include I
  • WinForms 中的 EF:如何过滤 BindingSource/DGW 中的数据 (.Local.ToBindingList())

    我按照本教程生成了 EF 模型 首先是数据库 和数据源http msdn microsoft com en us data jj682076 aspx http msdn microsoft com en us data jj682076
  • 不支持 EF6 上下文类型“System.Data.Entity.Core.Objects.ObjectContext”

    我有一个使用 Visual Studio 2013 和 ADO NET 实体数据模型 EF6 创建的新项目 现在我必须使用一些动态数据函数 例如访问 MetaTable 对象 所以我添加以下代码 MetaModel model new Me
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 实体框架中的实体图是什么?

    我一直在研究一些实体框架教程 并且遇到了这个词实体图 我对这个术语及其用法还没有清楚的了解 任何人都可以提供有关此主题的信息 例如它是什么及其在实体框架上下文中的用途 当实例化的对象以某种关系连接在一起时 它们被称为 图或实体图 实体框架有
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • 如何让 Entity Framework 6 + Sqlite + 代码优先工作?

    我正在尝试创建一个简单的项目来探索 Entity Framework 6 Code First 与 sqlite db 提供程序如何工作 但是当我完成我的应用程序时 我收到错误 实体框架提供程序类型 System Data SQLite S
  • 包管理器控制台中缺少文件错误

    我们的开发团队的一些成员在打开包管理器控制台时开始看到以下错误 它完全阻止我们运行实体框架命令 我们已经检查过并且提到的文件确实存在 GetEvent types ps1xml Diagnostics Format ps1xml Diagn
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • Java正则表达式匹配开始/结束标签导致堆栈溢出

    标准执行情况Java Pattern类使用递归来实现多种形式的正则表达式 例如 某些运算符 交替 这种方法会导致输入字符串超过 相对较小 长度的堆栈溢出问题 该长度甚至可能不超过 1 000 个字符 具体取决于所涉及的正则表达式 一个典型的
  • MS-SQL 按降序对输出进行排序

    我有一个 MS SQL 查询 数据库中有数千行记录 SELECT DISTINCT TOP 7 DATENAME MM mydatetime CAST DAY mydatetime AS VARCHAR 2 as thedate MONTH
  • MASM SEG 运营商

    假设我们正在使用 MASM 6 1 16 位 大数据模型编写汇编代码 并且我们有一个名为 MY VAR 的变量 标签 一个名为 MY SEG 的段和一个名为 MY GROUP 的段组 假设 MY VAR 放置在 MY SEG 中 并且 MY
  • 使用 Powershell 监听按键,但不要等待

    我正在尝试编写一个定期切换大写锁定键的脚本 但我也希望能够切换该脚本 因为它会导致其他功能出现一些问题 例如 alt tab 键 以及滚动任务栏中的窗口以查看预览 到目前为止我的脚本是 outer while true do echo To
  • 如何在 Blazor 中执行客户端 UI 事件

    我刚刚开始使用 Blazor 我已经看到了这个新框架的巨大潜力 不过 我想知道它将如何处理简单的事情 例如将焦点设置在输入控件上 例如 在处理单击事件后 我想将焦点设置到文本输入控件 我是否必须使用 JQuery 来完成类似的事情 或者 B
  • 使用 SQLAlchemy 正确的文件结构以及如何将数据添加到数据库

    我正在尝试构建一个简单的博客平台来学习Python和Flask 我正在使用 SQLAlchemy 连接到 Heroku 和 Flask s3 上托管的 Postgres 数据库 以提供来自 AWS 存储桶的静态文件 我主要是遵循这个 htt
  • google.maps.places 及其自动完成方法未定义

    我正在加载谷歌地图 API https developers google com maps documentation javascript jQuery http jquery com 和这个地理完整 http ubilabs gith
  • 在 Spring 框架下:警告:警告找不到记录器的附加程序(org.springframework.web.context.ContextLoader)

    我花了一整天的时间试图解决 web 应用程序中使用 log4j 时遇到的日志记录问题 无论我做什么 我都无法摆脱以下问题 log4j WARN No appenders could be found for logger org sprin
  • 如何在 python 中正确打印 unicode 字符列表?

    我正在尝试在 python 字符串中搜索表情符号 所以我有 例如 em test U0001f680 print em test test This is a test string if any x in test for x in em
  • 将文本识别为简体中文与繁体中文

    给定一段已知为中文且以 UTF 8 编码的文本块 有没有办法确定它是简体还是繁体 我不知道这是否有效 但我会尝试使用 iconv 来查看它是否能在字符集之间正确转换 并将相同转换的结果与 TRANSLIT 和 IGNORE 进行比较 如果两
  • Opera Unite 和 Node.js 有什么区别?

    两者似乎都允许完全使用 JavaScript 编写应用程序 两者都允许服务器端 JS 和客户端 JS 那么 从技术和编程的角度来看 两者有什么区别呢 Opera Unite 是一种协作技术 它使用 Opera 桌面浏览器内的紧凑型服务器来共
  • 查询矩形集合以查找输入矩形的重叠

    在多维空间中 我有一组矩形 所有矩形都与网格对齐 我宽松地使用 矩形 这个词 在三维空间中 它们将是矩形棱柱 我想查询此集合中与输入矩形重叠的所有矩形 保存矩形集合的最佳数据结构是什么 我会不时地向集合中添加矩形和从集合中删除矩形 但这些操
  • 监听键盘事件而不捕获它们?

    我正在编写一个命令行应用程序 它侦听 X Windows 中的 Control 键释放事件 并在检测到这些事件时向另一个进程发出警报 作为 GNU Linux 的新手 我宁愿避免摸索 GCC 因此我正在寻找基于脚本的解决方案 由于我对 Py
  • 是否可以在运行时更改 AWS Lambda 的日志级别?

    我在 AWS 上运行 lambda 并使用 slf4j 进行日志记录 项目要求的一部分是可以使用环境变量在运行时设置日志级别 但我不确定这是否可能 我使用以下代码 但将 UI 中的环境变量 LOG LEVEL 更改为 DEBUG 对添加到
  • DBMS_XPLAN.DISPLAY_CURSOR 与解释计划(如果不使用 Gather_plan_statistics 提示)

    只是要求澄清两者之间的区别 据我所知 解释计划为您提供了理论的执行计划 而 DBMS XPLAN DISPLAY CURSOR 为您提供actual带有语句执行统计信息的执行计划 EXPLAIN PLAN 将此数据存储在 PLAN TABL
  • Blazor onclick 事件从循环传入计数器

    我目前正在通过 Blazor 中的本地解决方案实现表分页 但遇到了一些困难 麻烦的代码如下 用于渲染网格下方的分页按钮 for int i 0 i lt vm TotalPages i
  • easy_install 安装了各种版本的 python、mac osx

    我在 mac OSX 10 6 机器上有各种版本的 python 其中一些安装了 macports gt python select l Available versions current none python24 python26 p
  • 如何防止命令行参数由 R 解释而不是仅由我的脚本解释?

    我正在使用docopt https github com docopt docopt RR 的实现 我的脚本有一个命令行选项 其缩写形式为 g 当我运行我的脚本时 似乎这个参数首先由 R 解释 然后由我的脚本解释 因此 我因为没有为 GUI
  • SoapClient 尝试获取架构文件时出现 401 身份验证错误

    我的应用程序通常连接到第三方服务器以通过 SOAP WSDL 获取数据 this gt soap client new SoapClient https the domain 443 path wsdl array trace gt 1 l
  • 如何优化 EF Code First 查询?

    已更新 请参阅底部的更新 我使用 EF 代码优先 并且总体上对此感到满意 然而 一个简单 且常见 的操作导致 EF 生成极其复杂的 SQL 这降低了我的应用程序的速度 我只是使用 整数 ID 列表来获取一组实体 但因为我需要大量子实体的详细