2008-08-27 30 views
7

Trong podcast herding code 14 ai đó đề cập rằng stackoverflow hiển thị các truy vấn được thực hiện trong một yêu cầu ở cuối trang.Cách theo dõi truy vấn trên dữ liệu LINQ to sql DataContext

Nghe có vẻ như là một ý tưởng tuyệt vời đối với tôi. Mỗi lần tải một trang, tôi muốn biết những câu lệnh sql nào được thực hiện và cũng là tổng số lượng các chuyến đi vòng DB. Có ai có giải pháp gọn gàng cho vấn đề này không?

Bạn nghĩ số truy vấn có thể chấp nhận là gì? Tôi đã nghĩ rằng trong quá trình phát triển, tôi có thể có ứng dụng của tôi ném một ngoại lệ nếu có hơn 30 truy vấn được yêu cầu để hiển thị một trang.

EDIT: Tôi nghĩ tôi không phải giải thích rõ ràng câu hỏi của mình. Trong một yêu cầu HTTP, một ứng dụng web có thể thực hiện một hoặc nhiều câu lệnh sql. Tôi muốn có các câu lệnh đó được thêm vào cuối trang, cùng với số lượng các câu lệnh.

ĐÂY LÀ GIẢI PHÁP CỦA TÔI:

Tôi tạo ra một lớp TextWriter rằng DataContext thể viết thư cho:

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++; 
     } 
    } 

Trong thiết lập constructor tôi của DataContext các logger:

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

Cuối cùng, Tôi sử dụng sự kiện Application_OnEndRequest để thêm kết quả vào cuối trang:

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); 
    } 

Trả lời

3

Nếu bạn đặt. ToString() vào biến truy vấn var bạn sẽ nhận được sql. Bạn có thể laso sử dụng điều này trong Debug vi VS2008. Debug Visualizer

ví dụ:

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; 

Dính vào trang của bạn và bạn sẽ nhận được SQL bị loại bỏ trên trang. Rõ ràng, tôi sẽ bọc nó theo một phương thức nhỏ mà bạn có thể bật/tắt.

+0

Đã giúp tôi nhận: Db.Log = Console.Out; – Haroon

Các vấn đề liên quan