none
如何在ASP.NET中了解LINQ语句性能 RRS feed

  • 常规讨论

  • 如果是在桌面程序中,只需要
    CODE:
    _context.Log = Console.Out;

    即可在控制台输出SQL语句。可是在ASP.NET中又该怎么办呢?
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    这时我想起了StringWriter。用它就可以代替Console.Out帮我们接收输出的日志,保存在一个StringBuilder里。oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    于是构造一个辅助类:oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    CODE:
    using System;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Collections.Generic;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Linq;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Web;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.IO;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Text;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    namespace Clowwindy.Models{oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public static class LogHelper{oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public static StringBuilder Log = new StringBuilder();oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public static TextWriter In = new StringWriter(Log);oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public static string GetAllLog(){In.Flush();oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    return Log.ToString();oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public static void Clean(){oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    Log = new StringBuilder();In = new StringWriter(Log);oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    再添加一个页面log.aspx,用来显示日志:oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    CODE:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Log.aspx.cs" Inherits="Clowwindy.Log" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"><title>SQL Log</title></head><body><form id="form1" runat="server"><asp:Button ID="btn_Clean" runat="server" Text="清空" /><div><asp:Literal ID="Literal1" runat="server"></asp:Literal></div></form></body></html>
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    CODE:
    using System;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Collections.Generic;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Linq;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Web;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Web.UI;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using System.Web.UI.WebControls;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    using Clowwindy.Models;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    namespace Clowwindy{oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    public partial class Log : System.Web.UI.Page{oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    protected void Page_Load(object sender, EventArgs e){oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    if (Request.UserHostAddress != "127.0.0.1"){oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    Response.End();return;oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    Literal1.Text = LogHelper.GetAllLog().Replace("\n","\n");oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    }oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    protected void btn_Clean_Click(object sender, EventArgs e){LogHelper.Clean();Literal1.Text = null;}}}
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    最后在所有new DataContext的地方加上oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    CODE:
    public Repository(){_context = new TDataContext();_context.Log = LogHelper.In;}
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    oV¯¾AžNwww.nfhot.comÜù 6¨FÞ±t
    打开log.aspx,即可看到之前执行的SQL语句。
    2009年6月8日 9:28

全部回复

  • 还可以用 SQL Server Profiler 来监视应用程序对数据库执行了什么操作以及这些操作花费的时间~
    宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。
    2009年6月8日 14:18
    版主
  • public TextWriter Log { get; set; }
    Log属性本来就是这样用的。
    好好学习,天天向上。
    2009年6月14日 10:50