Как посмотреть SQL, сгенерированный структурой сущностей?
(В моем конкретном случае я использую провайдер MySQL - если это имеет значение)
entity-framework
ado.net
н.у.к.
источник
источник
Ответы:
Вы можете сделать следующее:
или в EF6:
Это даст вам сгенерированный SQL.
источник
.Single()
вашего объекта больше нет,IQueryable
я думаю.result
вSystem.Data.Entity.Infrastructure.DbQuery<T>
, затем получить внутреннее свойствоInternalQuery
как(System.Data.Entity.Internal.Linq.InternalQuery<T>)
, и только потом использоватьToTraceString()
result.ToString()
Для тех, кто использует Entity Framework 6 и выше, если вы хотите просмотреть выходной SQL в Visual Studio (как я сделал), вы должны использовать новую функциональность регистрации / перехвата.
Добавление следующей строки приведет к тому, что сгенерированный SQL (вместе с дополнительными подробностями, связанными с выполнением) будет отображаться на панели вывода Visual Studio:
Дополнительная информация о входе в EF6 в этой замечательной серии блогов: http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/
Примечание. Убедитесь, что ваш проект запущен в режиме отладки.
источник
Начиная с EF6.1 вы можете использовать Interceptors для регистрации регистратора базы данных. Смотрите главы "Перехватчики" и "Ведение журнала операций базы данных" в файл здесь
источник
Если вы используете DbContext, вы можете сделать следующее, чтобы получить SQL:
источник
ToString()
даст вам запрос с переменными в нем, напримерp__linq__0
, вместо конечных значений (например, вместо 34563p__linq__0
)Применимо для EF 6.0 и выше: для тех из вас, кто хочет узнать больше о функциональных возможностях ведения журналов и добавить некоторые из уже приведенных ответов.
Любая команда, отправленная из EF в базу данных, теперь может быть зарегистрирована. Чтобы просмотреть сгенерированные запросы из EF 6.x, используйте
DBContext.Database.Log property
Что попадает в журнал
Пример:
Вывод:
Чтобы войти во внешний файл:
Более подробная информация здесь: ведение журнала и перехват операций с базой данных
источник
В EF 4.1 вы можете сделать следующее:
Это даст вам сгенерированный SQL.
источник
ToString()
выводом является пространство имен этого пользовательского типа. Например, если приведенный выше код былselect new CustomType { x = x.Name }
, возвращаемое значение было бы что-то вродеCompany.Models.CustomType
вместо сгенерированного SQL.System.Data.Objects.ObjectQuery``1[MyProject.Models.Product]
для меня.Мой ответ адресован ядру EF . Я ссылаюсь на этот вопрос GitHub и документы по настройке
DbContext
:просто
Переопределите
OnConfiguring
метод вашегоDbContext
класса (YourCustomDbContext
), как показано здесь, чтобы использовать ConsoleLoggerProvider; Ваши запросы должны войти в консоль:Сложный
Это сложный случай избегает переопределения на
DbContext
OnConfiguring
методе. , что не рекомендуется в документах: «Этот подход не подходит для тестирования, если тесты не нацелены на полную базу данных».Этот сложный случай использует:
IServiceCollection
inStartup
classConfigureServices
(вместо переопределенияOnConfiguring
метода; преимуществом является более слабая связь междуDbContext
и тем, чтоILoggerProvider
вы хотите использовать)ILoggerProvider
(вместо того, чтобы использоватьConsoleLoggerProvider
реализацию, показанную выше; преимущество заключается в том, что наша реализация показывает, как мы должны регистрироваться в File (я не вижу провайдера File Logging, поставляемого с EF Core ))Нравится:
Вот реализация
MyLoggerProvider
(и онаMyLogger
добавляет свои журналы в файл, который вы можете настроить; ваши запросы EF Core появятся в файле.)источник
Есть два способа:
ToTraceString()
. Вы можете добавить его в окно просмотра и установить точку останова, чтобы увидеть, каким будет запрос в любой заданной точке для любого запроса LINQ.tail -f
. Вы можете узнать больше о средствах ведения журнала MySQL в официальной документации . Для SQL Server самый простой способ - использовать включенный профилировщик SQL Server.источник
Чтобы запрос всегда был под рукой, без изменения кода добавьте его в свой DbContext и проверьте его в окне вывода в Visual Studio.
Аналогично ответу @Matt Nibecker, но при этом вам не нужно добавлять его в ваш текущий код каждый раз, когда вам нужен запрос.
источник
SQL Management Studio => Инструменты => Профилировщик SQL Server
Файл => Новая трассировка ...
Используйте Шаблон => Пусто
Выбор события => T-SQL
Проверка левой стороны для: SP.StmtComplete
Фильтры столбцов могут использоваться для выбора определенного ApplicationName или DatabaseName
Запустите этот профиль и запустите запрос.
Нажмите здесь для получения информации об источнике
источник
Ну, на данный момент я использую Express Profiler для этой цели, недостатком является то, что он работает только для MS SQL Server. Вы можете найти этот инструмент здесь: https://expressprofiler.codeplex.com/
источник
Вернет SQL-запрос. Работа с использованием datacontext EntityFramework 6
источник
Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1 [System.Linq.IGrouping2[System.Int32,String]]
вместо фактического запроса. Я что-то упустил или вы забыли что-то упомянуть?Я делаю интеграционный тест, и мне это нужно для отладки сгенерированного оператора SQL в Entity Framework Core 2.1, поэтому я использую
DebugLoggerProvider
илиConsoleLoggerProvider
вот так:Вот пример вывода из консоли Visual Studio:
источник
Necromancing.
Эта страница является первым результатом поиска при поиске решения для любой платформы .NET Framework, поэтому здесь, в качестве общедоступной службы, описывается, как это делается в EntityFramework Core (для .NET Core 1 & 2):
И затем эти методы расширения (IQueryableExtensions1 для .NET Core 1.0, IQueryableExtensions для .NET Core 2.0):
источник
var modelVisitor = (RelationalQueryModelVisitor) queryCompilationContext.CreateQueryModelVisitor();
В моем случае для EF 6+ вместо использования в Immediate Window, чтобы найти строку запроса:
Мне пришлось использовать это, чтобы получить сгенерированную команду SQL:
Конечно, ваша подпись анонимного типа может отличаться.
НТН.
источник
Я только что сделал это:
И результат, показанный в выводе :
источник
Для меня, используя EF6 и Visual Studio 2015, я вошел
query
в ближайшее окно, и он дал мне сгенерированный оператор SQLисточник
Если вы хотите иметь значения параметров (не только,
@p_linq_0
но и их значения), вы можете использоватьIDbCommandInterceptor
и добавить некоторые записи вReaderExecuted
метод.источник
Хотя здесь есть хорошие ответы, ни один из них не решил полностью мою проблему (я хотел получить полный оператор SQL, включая параметры , из DbContext из любого IQueryable. Следующий код делает именно это. Это комбинация фрагментов кода из Google. I только проверил это с EF6 + .
Кстати, эта задача заняла у меня намного больше времени, чем я думал. Абстракции в Entity Framework немного много, имхо.
Сначала использование. Вам понадобится явная ссылка на «System.Data.Entity.dll».
Следующий класс преобразует IQueryable в DataTable. Измените так, как вам нужно:
Чтобы использовать, просто назовите это как ниже:
источник
Решение Entity Framework 4
Большинство ответов здесь были специфичными для EF6. Вот один из тех, кто все еще использует EF4.
Этот метод заменяет
@p__linq__0
/ etc. параметры с их фактическими значениями, так что вы можете просто скопировать и вставить вывод в SSMS и запустить его или отладить.источник