Как получить запрос TSQL из LINQ DataContext.Метода submitchanges()

Я использую Linq для SQL. У меня есть DataContext, против которого я .SubmitChanges()'ing. Существует ошибка вставки поля идентификатора, и я хотел бы видеть запрос, который он использует для вставки этого поля идентификатора.

Я не вижу сам запрос в quickwatch; где я могу найти его из отладчика?

7 ответов


на самом деле есть очень простой ответ на ваш вопрос

просто вставьте это в окно часов

((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString()

многие люди пишут свой собственный "DebugWriter" и прикрепляют его так:

// Add this class somewhere in your project...
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; }
   }
}

// Then attach it to the Log property of your DataContext...
myDataContext.Log = new DebugTextWriter()

это выведет все, что Linq-to-Sql делает в окно отладки Visual Studio.


дальше ответ Портмана, Если вы консольное приложение, это так же просто, как:

myDataContext.Log = Console.Out;

или вы можете использовать что-то вроде Linq2Sql Profiler, который является довольно отличным инструментом и фактически правильным инструментом для работы:

Linq to SQL Profiler-визуальный отладчик в реальном времени для Linq to SQL


запустите SQL Profiler, если он у вас есть. Он покажет весь трафик в вашу базу данных, включая текст команды SQL.


FooDataContext dc = new FooDataContext();

StringBuilder sb = new StringBuilder();
dc.Log = new StringWriter(sb);

var result=from r in dc.Tables select d;

.....
string query=sb.ToString();

Я согласен, что Linq to SQL Profiler является правильным инструментом для этой работы. Но если вы не хотите тратить деньги или просто нужно сделать что-то простое, мне нравится подход DebugTextWriter.

прочитав этот вопрос, я отправился искать что-то более крепкое. Оказывается, Дэмиен Guard также написал очень хорошую статью о создании разных писателей для работы с различными вещами, такими как вывод в память, отладка, файл, несколько мест назначения или даже использование простые делегаты.

в итоге я использовал пару его идей и написал ActionTextWriter, который может обрабатывать более одного делегата, и я подумал, что поделюсь этим здесь:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Writers
{
    public class ActionTextWriter : TextWriter
    {
        protected readonly List<Action<string>> Actions = new List<Action<string>>();

        public ActionTextWriter(Action<string> action)
        {
            Actions.Add(action);
        }

        public ActionTextWriter(IEnumerable<Action<string>> actions)
        {
            Actions.AddRange(actions);
        }

        public ActionTextWriter(params Action<string>[] actions)
        {
            Actions.AddRange(actions);
        }

        public override Encoding Encoding
        {
            get { return Encoding.Default; }
        }

        public override void Write(char[] buffer, int index, int count)
        {
            Write(new string(buffer, index, count));
        }

        public override void Write(char value)
        {
            Write(value.ToString());
        }

        public override void Write(string value)
        {
            if (value == null)
            {
                return;
            }

            foreach (var action in Actions)
            {
                action.Invoke(value);
            }
        }
    }
}

вы можете добавить столько действий, сколько вам нравится. В этом примере выполняется запись в файл журнала и консоль Visual Studio с помощью отладки.Пиши:

// Create data context
var fooDc = new FooDataContext();

// Create writer for log file.
var sw = new StreamWriter(@"C:\DataContext.log") {AutoFlush = true};

// Create write actions.
Action<string> writeToDebug = s => Debug.Write(s);
Action<string> writeToLog = s => sw.Write(s);

// Wire up log writers.
fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog);

и, конечно, если вы хотите сделать более простые в использовании манжеты, вы всегда можете расширения ActionTextWriter... писать общий подход и повторное использование, верно?

using System.Diagnostics;
using System.IO;

namespace Writers
{
    public class TraceTextWriter : ActionTextWriter
    {
        public TraceTextWriter()
        {
            Actions.Add(s => Trace.Write(s));
        }
    }

    public class FileTextWriter : ActionTextWriter
    {
        public FileTextWriter(string path, bool append = false)
        {
            var sw = new StreamWriter(path, append) {AutoFlush = true};
            Actions.Add(sw.Write);
        }
    }
}

вот подробное описание: http://debugmode.net/2011/06/26/logging-in-linq-to-sql/