How to extract the Sql Command from a Compiled Linq Query
В обычных (не скомпилированных) запросах Linq to Sql вы можете извлечь SQLCommand из IQueryable с помощью следующего кода:
SqlCommand cmd = (SqlCommand)table.Context.GetCommand(query);
Можно ли сделать то же самое для скомпилированного запроса?
Следующий код предоставляет мне делегата для скомпилированного запроса:
private static readonly Func<Data.DAL.Context, string, IQueryable<Word>> Query_Get =
CompiledQuery.Compile<Data.DAL.Context, string, IQueryable<Word>>(
(context, name) =>
from r in context.GetTable<Word>()
where r.Name == name
select r);
Когда я использую это, чтобы сгенерировать IQueryable и попытаться извлечь SqlCommand, он, похоже, не работает. При отладке кода я вижу, что возвращенный SqlCommand имеет "очень" полезный CommandText "SELECT NULL AS [EMPTY]"
using (var db = new Data.DAL.Context())
{
IQueryable<Word> query = Query_Get(db, "word");
SqlCommand cmd = (SqlCommand)db.GetCommand(query);
Console.WriteLine(cmd != null ? cmd.CommandText : "Command Not Found");
}
Я не могу найти в Google ничего об этом конкретном сценарии, так как, без сомнения, это не обычное дело...
Итак.... Есть мысли?
2 ответа
Вы можете использовать журнал DataContext:
db.Log = Console.Out;
Должен быть выход из.NET, но вы можете профилировать свою базу данных SQL Server и фиксировать отправленный ей SQL. Вы можете сделать это из SQL Management Studio.