【问题标题】:How to "tag" Entity Framework Queries [duplicate]如何“标记”实体框架查询[重复]
【发布时间】:2015-11-20 19:20:05
【问题描述】:

我正在帮助提高复杂应用程序的性能,其中包含散布在代码库中的数百个实体框架查询。我们遇到的一个问题是,当我们运行 SQL Profiler 并捕获 Entity Framework 查询时,查找实际导致通过分析器的 sql 语句的代码非常耗时。我想知道是否有某种方法可以用 sql 语句中出现的唯一标识符“标记”每个实体框架语句。类似于向实体框架为每个语句生成的实际 sql 语句添加注释。然后我们可以在分析器跟踪中看到注释,并在代码中搜索标签。关于我们如何去做这件事的任何想法?我猜一定有某种方法可以拦截 EF 生成的 sql 并在它发送到数据库服务器之前添加我们的注释。

【问题讨论】:

  • 你可以在你的选择中加入一个常量,比如select new { Tag = "Query 123", ...}
  • 您可能需要将该常量连接到某个东西以确保它作为参数传递。
  • 如果选择得到优化,我想知道类似的东西是否会在“where”子句中起作用。我很确定“1=1”没有得到优化,所以也许“WHERE 'Tag1' = 'Tag1'”会起作用。

标签: c# entity-framework sql-server-profiler


【解决方案1】:

我个人会使用代码分析器而不是 SQL 分析器(我更喜欢 JetBrain 的 dotTrace)。 Entity Framework 有时会根据它必须执行的操作生成多个查询,因此将您看到的每个查询标记为特定操作并不是一件容易的事,因为它不一定会在每个查询中找到它的方式。

根据我的经验,EF 性能问题通常是由于在错误的位置对 linq 查询执行操作,该操作执行了完整的表加载并水合了大量对象。代码分析器还可以让您准确地关注代码中的哪个位置来解决这些问题,而不是追查创建有问题的 SQL 语句的操作。

【讨论】:

  • 我支持这个建议。最近执行了这个确切的任务,我们尝试了一些不同的分析选项,这些选项帮助我们找到了需要很长时间的 EF 查询;正如@MutantNinja 解释的那样,大多数是由于检索表上的所有行/实体并理解实体而不是数据库上的过滤(优化 Linq 查询的 SQL 翻译)。
  • Intellitrace(VS 2013 Ultimate;VS 2015 Pro & Ultimate)也是一个有用的工具。
猜你喜欢
  • 2018-11-16
  • 2011-12-06
  • 2011-12-18
  • 2016-01-27
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多