Получить LINQ to sql statement (IQueryable) С параметрами
Я пытаюсь выяснить, есть ли способ получить (полный) SQL-запрос, который выполняется на сервере базы данных.
Я уже что-то нашел, но это не совсем то, что мне хотелось бы:
IQueryable<SomeType> someQuery = ...
string command = dataContext.GetCommand(query).CommandText;
В моем случае это дает мне командную строку примерно так:
SELECT TOP (50) [t0].[ID], ....
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0))
В базе данных выполняется:
exec sp_executesql N'SELECT TOP (50) [t0].[ID], ...
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0, @p1))',N'@p0 int,@p1 int',@p0=401,@p1=201
Есть ли способ получить этот "полный" оператор (так же, как и значения параметра) из кода С#?
Ответы
Ответ 1
Как только вы получите команду, вы можете распечатать CommandText, а затем прокрутить коллекцию параметров и распечатать все отдельные параметры.
Также есть визуализатор отладки linq-to-sql, который делает то же самое в режиме отладки.
Хорошим инструментом для просмотра запросов, поскольку они происходят, является Профилировщик Linq-to-sql
Ответ 2
(SqlCommand)dataContext.GetCommand(query)
предоставит вам доступ к коллекции параметров.
Ответ 3
Вы также можете использовать свойство DataContext Log для регистрации сгенерированного SQL (включая текст команды и параметры).
Просто установите YourDataContext.Log = SomeTextWriter
. Его можно записать в файл (Log = new StreamWriter(@"c:\temp\linq.log")
) или отладить окно, посмотреть это сообщение
Ответ 4
Вы также можете увидеть сгенерированный SQL-запрос, если у вас есть экземпляр
IQueryable<T>
и вызовите метод .ToString()
.
Например:
var db = new DbContext();
IQueryable<Blog> query = db.Blog.Where(tt=> tt.Id > 100).OrderByDescending(tt=>tt.Id);
var sqlString = query.ToString();
Console.WriteLine(sqlString);
Это будет генерировать вывод:
SELECT [Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title],
[Extent1].[Author] AS [Author],
[Extent1].[Text] AS [Text],
[Extent1].[CreatedAt] AS [CreatedAt],
[Extent1].[UpdatedAt] AS [UpdatedAt]
FROM [dbo].[Blogs] AS [Extent1]
WHERE [Extent1].[Id] > 100
ORDER BY [Extent1].[Id] DESC