查找SQL语句的LINQ语句的最简单方法是什么

时间:2011-11-04 15:09:16

标签: sql linq entity-framework

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

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

5 个答案:

答案 0 :(得分:10)

商业工具ORM ProfilerEntity Framework ProfilerHugati Query Profiler都会为生成SQL的方法提供堆栈跟踪。这使得在代码中找到LINQ相当容易,但它不能直接显示。

这些工具还具有以下优势:它们可以轻松地在应用程序执行的许多其他SQL语句中查找低效查询。

答案 1 :(得分:3)

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

http://efprof.com/

这里描述的工具也比较便宜,我没有使用过,但看起来非常有希望:

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

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

答案 2 :(得分:2)

我打赌Entity Framework Profiler(http://efprof.com/)会帮助你。工作流程与您要求的工作流程非常不同(这将是非常酷的BTW)。它是一个很好的工具,即使它不是你的最终解决方案,也值得一看。

祝你好运!

答案 3 :(得分:2)

如果您可以访问LINQ代码所在的ASP.NET代码,您可以或多或少知道您要查找的查询,将其复制到名为LINQPad的免费软件工具中并直接在那里运行以获取生成的SQL语句。 http://www.linqpad.net/

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

例如:

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

SQL Results标签:

-- 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]

这可能不是您正在寻找的,但值得了解此工具,因为它对快速测试LINQ查询非常有帮助。在那里,您可以快速编辑和运行以改进代码,而无需重新编译整个内容。

答案 4 :(得分:0)

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

因此,您可以使用时间戳和源代码上下文信息在单独的文本文件中记录每个查询。但这意味着要修改源中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;