Sono d'accordo che Linq per SQL Profiler è lo strumento giusto per questo lavoro. Ma se non vuoi spendere soldi o semplicemente devi fare qualcosa di semplice, mi piace l'approccio di DebugTextWriter.
Dopo aver letto questa domanda sono andato a cercare qualcosa di più robusto. Risulta anche Damien Guard wrote a very nice article sulla costruzione di diversi scrittori per gestire cose diverse come l'output in memoria, il debug, un file, più destinazioni o anche l'utilizzo di semplici delegati.
Finii con un paio delle sue idee e la scrittura di un ActionTextWriter in grado di gestire più di un delegato, e ho pensato di condividerle qui:
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);
}
}
}
}
È possibile aggiungere il numero di azioni che vuoi . Questo esempio scrive un file di log e la console in 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, naturalmente, se si vuole fare più semplici da usare a braccio, si può sempre estendere ActionTextWriter .. scrivere l'approccio generico e riutilizzare, giusto?
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);
}
}
}
È anche possibile configurare il DataContext per emettere le query in un file . – eglasius