查看LINQ生成SQL语句的几种方法

系统 1831 0

来自: http://www.yaosansi.com/post/1380.html

记录LINQ生成的SQL语句是常用的调试方式,而且能根据需要来优化LINQ生成的SQL语句,更能了深入的了解LINQ.

DataContext的Log属性来将LINQ to SQL生成的SQL语句格式化.

一.控制台程序(Console)

      dataContext.Log = Console.Out;
    

二.利用GetCommand方法

dataContext.GetCommand(query).CommandText;

三.使用LINQPad ( 官方网站 )

LINQPad支持C# 3.0 和 Framework 3.5的全部功能:

  • LINQ to SQL
  • LINQ to Objects
  • LINQ to XML

 

更多介绍请参考 李永京 学习LINQ工具:LINQPad

下载地址: http://www.albahari.com/LINQPad.exe

四.LINQ to SQL Debug Visualizer

ScottGu的LINQ to SQL Debug Visualizer可以在Debug过程中查看SQL语句.

介绍: http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

下载: http://www.scottgu.com/blogposts/linqquery/SqlServerQueryVisualizer.zip

安装方法
1. 关闭 VS2008。
2. 将压缩包中的 SqlServerQueryVisualizer.dll 拷贝到 \Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers。
3. 重启 VS2008 即可。

五.DebuggerWriter工具类

由于Console.Out方法在ASP.NET程序不起作用.

Kris Vandermotten 已经创建好了一个这个工具类, 你只要使用这样的语法:

        MyDataContext db = 
        
          new
        
         MyDataContext();
      
        db.Log = 
        
          new
        
         DebuggerWriter();
      
         
      

asp.net可以选择将Log信息直接发送到Debug的输出窗口.

源码:

          
using  System;
using  System.Diagnostics;
using  System.Globalization;
using  System.IO;
using  System.Text;

namespace  Vandermotten.Diagnostics
{
    
///   <summary>
    
///  Implements a  <see cref="TextWriter"/>  for writing information to the debugger log.
    
///   </summary>
    
///   <seealso cref="Debugger.Log"/>

     public   class  DebuggerWriter : TextWriter
    
{
        
private   bool  isOpen;
        
private   static  UnicodeEncoding encoding;
        
private   readonly   int  level;
        
private   readonly   string  category;

        
///   <summary>
        
///  Initializes a new instance of the  <see cref="DebuggerWriter"/>  class.
        
///   </summary>

         public  DebuggerWriter()
            : 
this ( 0 , Debugger.DefaultCategory)
        
{
        }


        
///   <summary>
        
///  Initializes a new instance of the  <see cref="DebuggerWriter"/>  class with the specified level and category.
        
///   </summary>
        
///   <param name="level"> A description of the importance of the messages. </param>
        
///   <param name="category"> The category of the messages. </param>

         public  DebuggerWriter( int  level,  string  category)
            : 
this (level, category, CultureInfo.CurrentCulture)
        
{
        }


        
///   <summary>
        
///  Initializes a new instance of the  <see cref="DebuggerWriter"/>  class with the specified level, category and format provider.
        
///   </summary>
        
///   <param name="level"> A description of the importance of the messages. </param>
        
///   <param name="category"> The category of the messages. </param>
        
///   <param name="formatProvider"> An  <see cref="IFormatProvider"/>  object that controls formatting. </param>

         public  DebuggerWriter( int  level,  string  category, IFormatProvider formatProvider)
            : 
base (formatProvider)
        
{
            
this .level  =  level;
            
this .category  =  category;
            
this .isOpen  =   true ;
        }


        
protected   override   void  Dispose( bool  disposing)
        
{
            isOpen 
=   false ;
            
base .Dispose(disposing);
        }


        
public   override   void  Write( char  value)
        
{
            
if  ( ! isOpen)
            
{
                
throw   new  ObjectDisposedException( null );
            }

            Debugger.Log(level, category, value.ToString());
        }


        
public   override   void  Write( string  value)
        
{
            
if  ( ! isOpen)
            
{
                
throw   new  ObjectDisposedException( null );
            }

            
if  (value  !=   null )
            
{
                Debugger.Log(level, category, value);
            }

        }


        
public   override   void  Write( char [] buffer,  int  index,  int  count)
        
{
            
if  ( ! isOpen)
            
{
                
throw   new  ObjectDisposedException( null );
            }

            
if  (buffer  ==   null   ||  index  <   0   ||  count  <   0   ||  buffer.Length  -  index  <  count)
            
{
                
base .Write(buffer, index, count);  //  delegate throw exception to base class
            }

            Debugger.Log(level, category, 
new   string (buffer, index, count));
        }


        
public   override  Encoding Encoding
        
{
            
get
            
{
                
if  (encoding  ==   null )
                
{
                    encoding 
=   new  UnicodeEncoding( false false );
                }

                
return  encoding;
            }

        }


        
public   int  Level
        
{
            
get   return  level; }
        }


        
public   string  Category
        
{
            
get   return  category; }
        }

    }

}

六.将LINQ to SQL生成的SQL语句写入日志文件

DataContext.Log是System.IO.TextWriter类型,所以你可以用以下的方法来做.

          

StreamWriter sw = new StreamWriter(

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "log.txt" ));

          dBLinqDataContext.Log = sw;            
        
          

var query = dataContext.Customers.Single<Customer>(c=>c.CustomerID.Contains( "s" ))

.Skip(0).Take(10).ToList();

          sw.Flush();            
        
          sw.Close();
        

但以上方法有个缺点,就是需要在每个实现的方法中都写这么多代码.使用起来太不方便.参照dataContext.Log = Console.Out的表现形式

由是有了FileLog类.(当然,FileLog类除了此功能还有一些基本的记录日志的方法)

使用时直接dataContext.Log = Yaosansi.IO.FileLog.Out;即可. 默认会在桌面上生成一个名叫UnNameFile.txt的文件.

当然如果你不想使用默认的文件名和路径也可以使用dataContext.Log =new Yaosansi.IO.FileLog("FileName")的方式.

下面是FileLog类的源码:

// 原文: http://www.yaosansi.com/post/1380.html
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.IO;

namespace  Yaosansi.IO
{
    
///   <summary>
    
///  文件操作
    
///   </summary>

     public   class  FileLog : TextWriter
    
{
        
构造函数

        
重写TextWriter

        
属性

        
方法


    }

}
http://www.cnblogs.com/songsh96/archive/2009/02/19/1393681.html

查看LINQ生成SQL语句的几种方法


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论