Получить оператор LINQ to sql (IQueryable) с параметрами - PullRequest
31 голосов
/ 14 июня 2011

Я пытаюсь выяснить, есть ли способ получить (полный) 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

Есть ли способ получить это 'полный 'оператор (а также значения параметров) из кода C #?

Ответы [ 4 ]

11 голосов
/ 31 мая 2017

Вы также можете увидеть сгенерированный 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
11 голосов
/ 14 июня 2011

Получив команду, вы можете напечатать CommandText, а затем перебрать коллекцию параметров и распечатать все отдельные параметры.

Также имеется визуализатор отладки linq-to-sql который делает то же самое в режиме отладки.

Действительно хорошим инструментом для просмотра запросов по мере их выполнения является Linq-to-sql profiler

9 голосов
/ 14 июня 2011
(SqlCommand)dataContext.GetCommand(query)

даст вам доступ к коллекции параметров.

5 голосов
/ 15 июня 2011

Вы также можете использовать свойство Log DataContext для записи сгенерированного SQL (включает текст команды и параметры ).

Просто установите YourDataContext.Log = SomeTextWriter. Его можно записать в файл (Log = new StreamWriter(@"c:\temp\linq.log")) или в окно отладки, см. Этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...