У меня была задача, перевести все выражения 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, уже не представляет большой сложности.