Самый простой способ увидеть выражение LINQ to SQL в виде классического T-SQL-запроса.

m-r Tarakanoff 2010 M09 3
2621
0
0
0

У меня была задача, перевести все выражения LINQ to SQL, в обычный классический язык запросов T-SQL. На форумах, в основном, предлагали вытаскивать текст запроса, через создание объекта класса...

У меня была задача, перевести все выражения LINQ to SQL, в обычный классический язык запросов T-SQL.

На форумах, в основном, предлагали вытаскивать текст запроса, через создание объекта класса IQueryable, а затем обращаться к его свойствам или очень громоздкое решение в виде SQL-профайлера (перехватывать запросы на SQL-сервере).

Оказалось, что в отладчике Visual Studio для этого есть всё необходимое.

Допустим, у нас есть вот такое выражение LINQ to SQL:

var query = from s in context.oxite_Subscriptions
join sa in context.oxite_SubscriptionAnonymous on s.SubscriptionID equals sa.SubscriptionID into outer
from o in outer.DefaultIfEmpty()
join u in context.oxite_Users on s.UserID equals u.UserID
where s.PostID == post.ID
select s;

Запускаем этот код на выполнение в отладчике Visual Studio и добавляем переменную "query" в список контрольных значений. "Прогоняем" переменную, присваивая ей результат LINQ to SQL-выражения. И видим, что в списке контрольных значений, переменная "query" имеет значение...в виде текста запроса на классическом T-SQL:

SELECT [t4].[PostID] AS [ID], [t2].[test], [t2].[SubscriptionID], [t2].[Name], [t2].[Email], [t3].[UserID], [t3].[Username], [t3].[DisplayName], [t3].[Email] AS [Email2], [t3].[HashedEmail], [t3].[Password], [t3].[PasswordSalt], [t3].[DefaultLanguageID], [t3].[Status], [t0].[SubscriptionID] AS [ID2]
FROM [dbo].[oxite_Subscription] AS [t0]
LEFT OUTER JOIN (
SELECT 1 AS [test], [t1].[SubscriptionID], [t1].[Name], [t1].[Email]
FROM [dbo].[oxite_SubscriptionAnonymous] AS [t1]
) AS [t2] ON [t0].[SubscriptionID] = [t2].[SubscriptionID]
INNER JOIN [dbo].[oxite_User] AS [t3] ON [t0].[UserID] = [t3].[UserID]
INNER JOIN [dbo].[oxite_Post] AS [t4] ON [t4].[PostID] = [t0].[PostID]
WHERE [t0].[PostID] = @p0

Конечно, этот T-SQL предназначен для СУБД MS SQL, но доработка до стандартного SQL, уже не представляет большой сложности.

Оцените пост

-4
Дальше