Ich stimme zu, dass Linq zu SQL Profiler das richtige Werkzeug für diesen Job ist. Aber wenn Sie das Geld nicht ausgeben oder einfach etwas Einfaches tun wollen, mag ich den DebugTextWriter Ansatz.
Nachdem ich diese Frage gelesen hatte, machte ich mich auf die Suche nach etwas robusterem. Es stellt sich heraus, Damien Guard auch wrote a very nice article über den Aufbau verschiedener Autoren mit verschiedenen Dingen wie die Ausgabe zu Speicher, Debug, eine Datei, mehrere Ziele oder sogar mit einfachen Delegaten.
gewickelt ich mit ein paar seiner Ideen und eine ActionTextWriter schreiben, die mehr als einen Delegierten umgehen kann, und ich dachte, dass ich es teilen würde hier:
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 wie Sie wollen . Dieses Beispiel schreibt in eine Protokolldatei und die Konsole in Visual Studio über 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);
Und natürlich, wenn Sie wollen einfachere, um die Manschette zu verwenden, aus, können Sie immer ActionTextWriter erweitern .. Schreiben Sie den generischen Ansatz und wiederverwenden, oder?
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);
}
}
}
Sie auch Ihre Datacontext zur Ausgabe der Abfragen in einer Datei konfigurieren können . – eglasius