2011-02-04 2 views

ответ

23

Вот что я нашел с помощью метода ObjectQuery. Используя консоль для тестирования, вы можете сделать следующее:

Создайте метод расширения, как показано ниже, затем вызовите его. Произнесите продукт продукта, затем SQL распечатает его как product.ToTraceString.

public static class MyExtensions 
{ 
    public static string ToTraceString<T>(this IQueryable<T> t) 
    { 
     string sql = ""; 
     ObjectQuery<T> oqt = t as ObjectQuery<T>; 
     if (oqt != null) 
      sql = oqt.ToTraceString(); 
     return sql; 
    } 
} 
+5

Он также может использоваться в окне просмотра VS: '((ObjectQuery) myQuery) .ToTraceString()'. Хороший! – icebat

+0

Как насчет агрегированных методов, таких как 'Count'? –

+5

Я не думаю, что работает при использовании dbContext, поскольку вы не можете использовать IQueryable для ObjectQuery в этом случае. – NER1808

18

Вы можете использовать LINQPad.

+0

Они говорят, что его помощь ObjectQuery или SQL Profiler. Как это сделать программно в консоли, например? – nellbryant

+1

Я не уверен, понял ли я последний вопрос ... По крайней мере, чтобы ответить на вопрос в вашем заголовке «Как просмотреть LINQ сгенерированные операторы SQL»: LINQPad имеет окно вывода, в котором вы можете выбрать «Результаты», «Лямбда» или «SQL». –

+0

Эй, это хороший инструмент с открытым исходным кодом !. Спасибо. – nellbryant

13

Вы могли бы посмотреть на Linq-to-SQL Debug Visualizer, или просто наведите курсор запроса Linq-на-SQL (подсказка должна показать генерироваться SQL), или доступ:

context.GetCommand(query).CommandText 
+0

Я еще не пробовал GetCommand. Мне нравится ссылка от Скотта Гу! Является ли этот Visualizer встроенным Visual Studio 2010? – nellbryant

+0

@nellbryant: нет, это все еще отдельное расширение, которое нужно захватить из галереи VS. –

50

Вы всегда можете прикрепить что-то свойство .Log вашего DataContext. Это покажет все команды SQL по мере их отправки.

Я делаю это в своей базе для объектов доступа к данным и вывод их на консоль отладки Visual Studio. Поскольку объекты создают свои DataContext я проверить это увидеть, если его отладки и прикрепить TextWritter вспомогательный класс, как это:

dbDataContext _dB = new dbDataContext(); 
_dB.CommandTimeout = 5000; 

#if DEBUG 
    _dB.Log = new DebugTextWriter(); 
#endif 

Вот вспомогательный объект для вывода отладочной консоли:

//utility class for output of TextWriter for the Visual Sudio Debug window 
class DebugTextWriter : System.IO.TextWriter 
{ 
    public override void Write(char[] buffer, int index, int count) 
    { 
     System.Diagnostics.Debug.Write(new String(buffer, index, count)); 
    } 

    public override void Write(string value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override Encoding Encoding 
    { 
     get { return System.Text.Encoding.Default; } 
    } 
} 
+2

Для тех, кто использует ** Entity Framework 6 ** проверьте [this] (http://stackoverflow.com/a/20751723/2218697) , надежда помогает кому-то. – stom

5

Вы можете запустить Профайлер SQL Server.

14
var q = from img in context.Images 
        ... 
     select img; 
string sql = q.ToString(); 

sql будет содержать запрос выбора sql.

EDIT: недостаток: параметров не будут иметь значения в это время

+1

Если вы отлаживаете локально и используете SQL Server, запустите SQL Profiler. Появится запрос со всеми параметрами. – Rich

0

только небольшое обновление, теперь вы можете использовать действие для входа в SQL:

// test SQL logger 
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message); 
_dB.Context().Database.Log = SQLLogger; 
Смежные вопросы