实体框架SQL事件探查器 - 如何追溯生成SQL的代码

时间:2014-02-26 12:25:10

标签: entity-framework data-access-layer

我们正在使用实体框架6.0来开发新应用程序。我们所有的实体查询都是从DAL层生成的。对于我们当前部署到生产的应用程序,我们使用SQL监视工具来跟踪SQL查询的性能。

我关心的是如何跟踪生成SQL的DAL类,以便解决实体查询的性能问题。我从该工具获得的只是实体框架生成的SQL查询。

其他人如何跟踪生产中的SQL查询问题?我知道我可以使用Glimpse但是如果你只有原始SQL,你如何追溯到生成SQL的实体框架查询?我尝试使用谓词构建器添加一个虚拟where子句,以查看它是否会显示在SQL中但是会被忽略。喜欢

  predicate = predicate.Or(u => "methodName" == "methodName");

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用New Relic来检测应用程序和SQL。他们有一个名为“密钥事务”的功能,它可以告诉您缓慢的事务(实际上只是为Web请求设置,但理论上可以让它适用于其他类型的应用程序)并允许您在这些事务中查看慢速SQL查询。

为了将数据访问层添加到正在检测的方法中,您可以按照https://docs.newrelic.com/docs/dotnet/dotnet-agent-custom-metrics

编辑检测xml文件

请注意,“密钥交易”功能属于高级附加功能,需要付费。你确实可以免费使用一段时间,因此可能值得一看,看看它是否为你提供了足够的价值。

(顺便说一句,我与New Relic没有任何关系。)

答案 1 :(得分:0)

如果您有一个测试套件,其中包含生成查询的代码,您可以使用它将生成的SQL查询与生成它们的DAL方法一起保存到文件中。您可以使用以下代码(taken from this SO answer regarding viewing the SQL)执行此操作:

var result = from x in appEntities
         where x.id = 32
         select x;

var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();

如果您以某种结构化方式保存这些查询和方法名称(例如CSV),或许作为测试运行的副作用,您可以通过在此文件中搜索从生产中看到的查询来执行反向查找。您可能需要进行一些规范化,例如去除所有非重要的空格,并在两种情况下取​​出参数分配。