• 如何得到ADO.NET Entity Framework生成的SQL


    在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL,查看生成的T-SQL语句的方法,包括 EntityCommand和ObjectQuery类都有一个ToTraceString() 方法。需要注意的是:ToTraceString() 方法实际上没有执行查询操作,仅仅是转化查询为SQL脚本。

    (1)Entity SQL : EntityCommand.ToTraceString() 示例脚本

    (2)Entity SQL : ObjectQuery.ToTraceString() 示例脚本如下:

    (3)LINQ to Entities : (query as ObjectQuery).ToTraceString() 示例脚本

      需要使用类型转换,将LINQ to Entities (IQueryable) 查询转化为ObjectQuery,这样就可以调用ToTraceString() 方法了。

    也可以通过反射(Reflection)和Invoke() 方法,得到相同的结果:

    在EF 4.1中,我们可以直接调用DbQuery<>的ToString()方法得到所生成的SQL。这里的ToString()方法其实也就是调用了ObjectQuery<>的ToTraceString()方法。DbQuery<>.ToString() ==> System.Data.Entity.Internal.Linq.InternalQuery<>.ToString()方法,此方法在.NET Reflector得到的实现是这样的:

    public override string ToString() { return this._objectQuery.ToTraceString(); }

    以上讨论的方法都只能得到普通Select查询所生成的SQL,像其他Loading啊,更新啊,删除啊,添加等所生成的SQL并不能得到。EF并不像LINQ to SQL有DataContext.Log可以得到所有被执行的SQL命令。要实现这样的功能,需要自己拓展一下EF的data provider,比如这个例子:http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32。(可能的话,以后会为大家详细介绍下这个很酷的provider)
    当然我们也可以使用Visual Studio 2010 Ultimate所带的IntelliTrace功能或者SQL Server Profiler来得到EF所生成的SQL。 不过这两种方法只针对SQL Server和对应的T-SQL。

  • 相关阅读:
    .Net 中double相加的困惑
    关于内存资源消耗快的问题
    内存资源消耗快的问题
    跨线程更新窗体
    .Net实现双缓冲
    TypeConverter
    emf文件的导入
    在资源中存放图象与emf文件的显示
    笔记java中nextLine方法没有输入就跳过了
    Silverlight Triggers、Actions 和 Behaviors
  • 原文地址:https://www.cnblogs.com/LittleFeiHu/p/2134386.html
Copyright © 2020-2023  润新知