Самый простой способ найти инструкцию LINQ для оператора SQL

Я являюсь администратором базы данных SQL Server для компании, которая продает приложение ASP.NET MVC3, которое использует LINQ и Entity Framework 4 для доступа к базе данных. Когда я нахожу неэффективный запрос в кеше плана SQL Server, который был сгенерирован LINQ, я хотел бы найти этот оператор LINQ в исходном коде, чтобы я мог его оптимизировать. Каков наилучший способ найти LINQ, который сгенерировал задание SQL?

Например, есть ли способ поместить запись в файл конфигурации или каким-то образом украсить код, чтобы имя класса и метода или сам оператор LINQ были включены как комментарии в сгенерированном SQL?

Ответ 1

Коммерческие инструменты ORM Profiler, Entity Framework Profiler или Hugati Query Profiler предоставит вам трассировку стека для методов, сгенерированных SQL. Это позволяет довольно легко найти LINQ в коде, хотя он не отображается напрямую.

Эти инструменты также имеют то преимущество, что они позволяют легко находить неэффективные запросы среди многих других операторов SQL, выполняемых приложением.

Ответ 2

Хотя это не бесплатный инструмент, это может предоставить необходимую вам информацию:

http://efprof.com/

Существует также более дешевый инструмент, описанный здесь, который я не использовал, но выглядит очень многообещающим:

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

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

Ответ 3

Я уверен, что Entity Framework Profiler (http://efprof.com/) поможет вам. Рабочий процесс сильно отличается от того, что вы просили (что было бы довольно круто BTW). Это хороший инструмент, и стоит посмотреть, даже если это не ваше окончательное решение.

Удачи!

Ответ 4

Если у вас есть доступ к коду ASP.NET, где код LINQ вы можете более или менее знать, какой запрос вы ищете, скопируйте его в бесплатный инструмент под названием LINQPad и запустите его прямо там, чтобы получить сгенерированные операторы SQL, http://www.linqpad.net/

Вам нужно сначала получить запросы LINQ в вашем .net-коде, создать соединение с вашим источником данных, вставить код Linq в новые запросы и запустить их. Вы получите SQL-запрос, сгенерированный из кода LINQ.

Например:

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]

Это, вероятно, не совсем то, что вы ищете, но стоит знать об этом инструменте, так как очень полезно быстро протестировать запросы LINQ. Там вы можете быстро отредактировать и запустить для улучшения кода без перекомпиляции всего материала.

Ответ 5

Я не думаю, что вы можете легко сгенерировать сгенерированный SQL, но что вы можете сделать, это получить сгенерированный SQL перед отправкой запроса в базу данных.

Таким образом, вы можете записывать каждый запрос в отдельный текстовый файл с информацией о временной отметке и исходном коде. Но это означает изменение каждого места в вашем источнике, где запросы LINQ отправляются в базу данных. Возможно, в упрощенном виде есть класс расширения где-то в классе DataContext.

В любом случае, вот код для получения соответствующего SQL-запроса для запроса LINQ:

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

string command = dc.GetCommand(query).CommandText;