Это немного субъективный вопрос о конкретной ситуации. Основная цель этого вопроса для меня - напомнить себе о необходимости кодирования решения. Однако, если уже есть решение или альтернативный подход, я хотел бы знать это.
Я работаю над проектом и использую 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?