Como obter a consulta TSQL de Linq DataContext.submitchanges ()
-
10-07-2019 - |
Pergunta
Estou usando o LINQ para SQL. Eu tenho um datacontext contra o qual sou .SubMitchanges () 'ing. Há um erro inserindo o campo de identidade e eu gostaria de ver a consulta que está usando para inserir esse campo de identidade.
Não vejo a consulta em si dentro do relógio Quick; Onde posso encontrá -lo de dentro do depurador?
Solução
Na verdade, há uma resposta muito simples para sua pergunta
Basta colar isso na janela do seu relógio
((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString()
Outras dicas
Muitas pessoas têm escrito seu próprio "depurador" e a anexam assim:
// 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()
Isso produzirá tudo o que o LINQ-para-SQL está fazendo na janela de depuração do Visual Studio.
Mais para Resposta de Portman, se você é um aplicativo de console, é tão simples quanto:
myDataContext.Log = Console.Out;
Ou você pode usar algo como o Linq2SQL Profiler, que é uma ferramenta bastante excelente e, de fato, a ferramenta certa para o trabalho:
Linq para SQL Profiler - Debugger Visual em tempo real para Linq para SQL
Execute o SQL Profiler, se você o tiver. Ele mostrará todo o tráfego para o seu banco de dados, incluindo o texto do comando 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();
Concordo que o Linq to SQL Profiler é a ferramenta certa para este trabalho. Mas se você não quiser gastar o dinheiro ou apenas precisar fazer algo simples, eu gosto da abordagem de debugTextWriter.
Depois de ler esta pergunta, saí procurando algo mais robusto. Acontece que o guarda Damien também escreveu um artigo muito bom sobre a construção de escritores diferentes para lidar com coisas diferentes, como saída de memória, depuração, um arquivo, vários destinos ou até mesmo usar delegados simples.
Acabei usando algumas de suas idéias e escrevendo um ACTIONTEXTWriter que pode lidar com mais de um delegado, e pensei em compartilhar aqui:
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);
}
}
}
}
Você pode adicionar quantas ações quiser. Este exemplo grava em um arquivo de log e no console no Visual Studio via debug.write:
// 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);
E, claro ampliar ActionTextWriter ... Escreva a abordagem genérica e reutiliza, certo?
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);
}
}
}
Here is detailed description: http://debugmode.net/2011/06/26/logging-in-linq-to-sql/