Ich stimme zu, dass Linq to SQL Profiler das richtige Werkzeug für diese Aufgabe ist. Aber wenn Sie das Geld nicht ausgeben wollen oder nur etwas Einfaches brauchen, gefällt mir der Ansatz von DebugTextWriter.
Nachdem ich diese Frage gelesen hatte, machte ich mich auf die Suche nach etwas Robusterem. Es stellte sich heraus, dass Damien Guard auch schrieb einen sehr schönen Artikel über die Erstellung verschiedener Writer, um verschiedene Dinge zu behandeln, wie die Ausgabe in den Speicher, Debug, eine Datei, mehrere Ziele oder sogar die Verwendung einfacher Delegaten.
Ich habe einige seiner Ideen aufgegriffen und einen ActionTextWriter geschrieben, der mit mehr als einem Delegaten umgehen kann, und ich dachte, ich würde ihn hier teilen:
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);
}
}
}
}
Sie können so viele Aktionen hinzufügen, wie Sie möchten. Dieses Beispiel schreibt über Debug.Write in eine Protokolldatei und in die Konsole von 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);
Und natürlich können Sie, wenn Sie einfachere Modelle aus dem Stegreif verwenden möchten, jederzeit erweitern. ActionTextWriter... den generischen Ansatz schreiben und wiederverwenden, richtig?
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);
}
}
}
0 Stimmen
Sie können Ihren Datacontext auch so konfigurieren, dass die Abfragen in eine Datei ausgegeben werden.