Отладка запросов Entity Framework

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

Я работаю над проектом и использую Entity Framework 4 для доступа к базе данных. Дизайн базы данных - это то, что я не могу контролировать. База данных была разработана много лет назад, и, на мой взгляд, дизайн базы данных не подходит для текущих целей. Это приводит к очень сложным запросам.

Я впервые использую Entity Framework в проекте, но у меня есть обширный опыт разработки для MS SQL Server.

Я снова и снова делал следующее: :

  • Я пишу сложный L2E-запрос. Запрос либо медленный, либо возвращает неверные результаты
  • Я смотрю свой L2E-запрос и совершенно не знаю, как его улучшить
  • Я запускаю SQL Profiler и захватываю SQL, который EF сгенерировал из моего запроса
  • Я хочу выполнить часть этого sql, чтобы определить ту часть запроса, которая вызывает проблемы
  • Запрос проходит как sp_executesql с дюжиной параметров, потому что если параметр используется в запросе 3 раза, L2E создает 3 параметра и передает им всем одно и то же значение. То же самое с каждым параметром.
  • Теперь мне нужно извлечь SQL из sp_executesql, отменить экранирование всех экранированных апострофов и заменить каждый параметр в запросе его значением.
  • После этого я наконец могу запустить части запроса и выявить проблему.
  • Я возвращаюсь к своему коду L2E, измените его, чтобы исправить обнаруженную мной проблему, и цикл повторяется.

Честно говоря, я начинаю думать, что не следует использовать ORM, если у вас нет собственного дизайна базы данных .

Помимо этого, я хочу автоматизировать процесс отмены экранирования sql и замены параметров. Цель состоит в том, чтобы получить «голый» депараметризованный sql, который я могу запускать в SSMS.

Это очень простой пример того, что я вижу в профиле и что я хочу получить в результате. Мои реальные случаи во много раз сложнее.

Захват:

exec sp_executesql N'SELECT 
[Extent1].[ProductName] AS [ProductName]
FROM  [dbo].[Products] AS [Extent1]
INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
WHERE ([Extent1].[UnitPrice] > @p__linq__0) AND ([Extent2].[CategoryName] = @p__linq__1) AND (N''Chang'' <> [Extent1].[ProductName])',N'@p__linq__0 decimal(1,0),@p__linq__1 nvarchar(4000)',@p__linq__0=1,@p__linq__1=N'Beverages'

Желаемый результат:

SELECT 
[Extent1].[ProductName] AS [ProductName]
FROM  [dbo].[Products] AS [Extent1]
INNER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
WHERE ([Extent1].[UnitPrice] > 1) AND ([Extent2].[CategoryName] = N'Beverages') AND (N'Chang' <> [Extent1].[ProductName])

Я просто собираюсь написать код для преобразования подобных первого в подобные второму, если нет ничего лучше, я выложу решение здесь. Но может это уже кто-то сделал? А может есть профайлер или еще что, который может дать мне sql-код, который я могу частично выполнить в SSMS?

6
задан Andrew Savinykh 10 November 2012 в 20:47
поделиться