如何得到ADO.NET Entity Framework生成的SQL
2011-08-11 08:18
316 查看
在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。
(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。
相关文章推荐
- 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log
- ADO.NET Entity Framework 如何:使用 EdmGen.exe 生成模型和映射文件
- ADO.NET Entity Framework 如何:使用 EdmGen.exe 生成对象层代码
- 如何将 ADO.NET Framework 整合进 Spring.NET 中 (How to integrate ADO.NET Entity Framework into Spring.NET)
- [转]LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework
- ADO.NET Entity Framework如何:手动配置实体框架项目
- Comparision Linq toSQL with ADO.net Entity Framework
- EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景
- ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)
- ADO.NET Entity Framework: 由 Entity Object 執行 SQL 指令
- ADO.NET Entity Framework 如何:使用存储过程定义模型(实体框架)
- ADO.NET Entity framework 与 LINQ TO SQL 中的功能的一些差别(一)
- ADO.NET Entity Framework 如何:定义具有修改存储过程的模型(实体框架)
- 如何解决ado.net entity framework的使用,再别的调用项目中依然正常
- ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3)
- ADO.NET Entity Framework 如何:通过每种类型一个表继承以定义模型(实体框架)
- EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景:
- LINQ to SQL和ADO.NET Entity Framework之间的抉择
- ADO.NET Entity Framework如何:使用存储过程定义模型(实体框架)
- ADO.NET Entity Framework 如何:通过每个层次结构一个表继承以定义模型(实体框架)