2008-08-27 11 views
7

Im Podcast 14 erwähnt jemand, dass stackoverflow die Abfragen anzeigt, die während einer Anforderung am Ende der Seite ausgeführt wurden.Verfolgen von Abfragen auf einem Linq-to-sql-Datenkontext

Es klingt wie eine ausgezeichnete Idee für mich. Jedes Mal, wenn eine Seite geladen wird, möchte ich wissen, welche SQL-Anweisungen ausgeführt werden und auch die Gesamtzahl der DB-Rundreisen zählen. Hat jemand eine saubere Lösung für dieses Problem?

Was ist Ihrer Meinung nach eine akzeptable Anzahl von Abfragen? Ich dachte, dass während der Entwicklung meine Anwendung eine Ausnahme auslösen könnte, wenn mehr als 30 Abfragen zum Rendern einer Seite erforderlich sind.

EDIT: Ich denke, ich muss meine Frage nicht klar erklärt haben. Während einer HTTP-Anforderung kann eine Webanwendung ein Dutzend oder mehr SQL-Anweisungen ausführen. Ich möchte, dass diese Anweisungen am Ende der Seite angehängt werden, zusammen mit der Anzahl der Anweisungen.

HIER IST MEIN LÖSUNG:

ich eine Textwriter-Klasse erstellt, die die Datacontext schreiben:

public class Logger : StreamWriter 
    { 
     public string Buffer { get; private set; } 
     public int QueryCounter { get; private set; } 

     public Logger() : base(new MemoryStream()) 
     {} 

     public override void Write(string value) 
     { 
      Buffer += value + "<br/><br/>"; 
      if (!value.StartsWith("--")) QueryCounter++; 
     } 

     public override void WriteLine(string value) 
     { 
      Buffer += value + "<br/><br/>"; 
      if (!value.StartsWith("--")) QueryCounter++; 
     } 
    } 

Im Logger Konstruktor ich Setup Datacontext:

public HeraldDBDataContext() 
     : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource) 
    { 
     Log = new Logger(); 
    } 

Schließlich Ich verwende das Ereignis Application_OnEndRequest, um die Ergebnisse am Ende der Seite hinzuzufügen:

protected void Application_OnEndRequest(Object sender, EventArgs e) 
    { 
     Logger logger = DataContextFactory.Context.Log as Logger; 
     Response.Write("Query count : " + logger.QueryCounter); 
     Response.Write("<br/><br/>"); 
     Response.Write(logger.Buffer); 
    } 

Antwort

3

Wenn Sie .ToString() in eine Var-Abfragevariable setzen, erhalten Sie die SQL-Anweisung. Sie können dies auch in Debug und VS2008 verwenden. Debug Visualizer

ex:

var query = from p in db.Table 
      select p; 

MessageBox.SHow(query.ToString()); 
3
System.IO.StreamWriter httpResponseStreamWriter = 
new StreamWriter(HttpContext.Current.Response.OutputStream); 

dataContext.Log = httpResponseStreamWriter; 

Stick das in Ihrer Seite und Sie werden die SQL wurde auf der Seite gelöscht. Offensichtlich würde ich das in eine kleine Methode einbinden, die Sie aktivieren/deaktivieren können.

+0

Hat mir geholfen, zu bekommen: Db.Log = Console.Out; – Haroon

Verwandte Themen