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.

Другие вопросы по тегам