Какой самый простой способ найти оператор LINQ для оператора SQL - PullRequest
35 голосов
/ 04 ноября 2011

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

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

Ответы [ 5 ]

10 голосов
/ 04 ноября 2011

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

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

3 голосов
/ 04 ноября 2011

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

http://efprof.com/

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

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

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

2 голосов
/ 04 ноября 2011

Если у вас есть доступ к коду 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.Там вы можете быстро редактировать и запускать для улучшения кода без перекомпиляции всего материала.

2 голосов
/ 04 ноября 2011

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

Удачи!

0 голосов
/ 04 ноября 2011

Я не думаю, что вы можете легко изменить сгенерированный 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...