findSQL语句的LINQ语句最简单的方法是什么?

我是销售ASP.NET MVC3应用程序的公司的SQL Server DBA,该应用程序使用LINQ和Entity Framework 4来访问所有数据库。 当我在LINQ生成的SQL Server计划caching中发现一个效率低下的查询时,我希望能够在源代码中find该LINQ语句,以便对其进行优化。 find生成给定SQL语句的LINQ的最佳方法是什么?

例如,有什么办法把一个条目放在一个configuration文件中,或者以某种方式修饰代码,以便类和方法名或LINQ语句本身作为注释包含在生成的SQL中?

商业工具ORM Profiler , Entity Framework Profiler或Hugati Query Profiler将为您提供生成SQL的方法的堆栈跟踪。 这使得在代码中很容易findLINQ,尽pipe它不是直接显示的。

这些工具还具有这样的优点,即它们可以很容易地在应用程序执行的许多其他SQL语句中find效率低下的查询。

虽然它不是一个免费的工具,但它可能提供您需要的信息:

http://efprof.com/

这里还有一个比较便宜的工具,我没有用过,但是看起来非常有希望:

http://huagati.blogspot.com/2010/06/entity-framework-support-in-huagati.html

http://www.huagati.com/L2SProfiler/

我敢打赌,entity framework分析器( http://efprof.com/ )会帮助你。 工作stream程与你所要求的(这将是非常酷的BTW)非常不同。 这是一个很好的工具,即使它不是最终的解决scheme,也值得一看。

祝你好运!

如果您有权访问LINQ代码所在的ASP.NET代码,那么您可以或多或less地知道您正在查找哪个查询,请将其复制到名为LINQPad的免费工具中,然后直接在此处运行以获取生成的SQL语句。 http://www.linqpad.net/

您需要首先在您的.net代码上获得LINQ查询,创build一个到您的数据源的连接,将Linq代码粘贴到新的查询中并运行它们。 您将获得从LINQ代码生成的SQL查询。

例如:

from e in ETUSERs where e.LoginName.Contains("a") orderby e.LoginName select e 

SQL结果选项卡:

 -- Region Parameters DECLARE @p0 VarChar(1000) = '%a%' -- EndRegion SELECT [t0].[UserID], [t0].[UsrFirstName], [t0].[UsrLastName], [t0].[LoginName], [t0].[Location], [t0].[Password], [t0].[UsrEmail], ... FROM [ETUSER] AS [t0] WHERE [t0].[LoginName] LIKE @p0 ORDER BY [t0].[LoginName] 

这可能不是您正在查找的内容,但值得了解此工具,因为快速testingLINQ查询非常有帮助。 在那里,你可以快速编辑和运行来改善代码,而不用重新编译整个东西。

我不认为你可以很容易地修改生成的SQL,但你可以做的是在将查询发送到数据库之前获取生成的SQL。

所以,你可以logging每个查询在一个单独的文本文件与时间戳和源代码上下文信息。 但是这意味着要修改LINQ查询发送到数据库的源代码中的每个地方。 也许在DataContext类的某个地方有一个扩展点来简化这个。

无论如何,这里是获取LINQ查询相应的SQL查询的代码:

 YourDataContext dc = new YourDataContext(); IQueryable<YourEntityClass> query = from e in dc.YourEntities where ... select e; string command = dc.GetCommand(query).CommandText;