如何得到EF查询生成的SQL

运维 数据库运维
最近挺忙的,只能为大家带来一些使用EF的小技巧。有关EF4.1的使用与探索将在之后一段时间为大家奉上。今天为大家带来如何得到EF查询所生成的SQL。

最近挺忙的,只能为大家带来一些使用EF的小技巧。有关EF4.1的使用与探索将在之后一段时间为大家奉上。今天为大家带来如何得到EF查询所生成的SQL。

在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL。

  1. using (var context = new TestDBEntities())  
  2. {  
  3.     var query = from p in context.Parents  
  4.                 where p.Name == "Lingzhi"  
  5.                 select p;  
  6.  
  7.     ObjectQuery<Parent> parents = query as ObjectQuery<Parent>;  
  8.     if (parents != null)  
  9.     {  
  10.         string sql = parents.ToTraceString();  
  11.     }  
  12. }  

这里所生成的SQL为:

  1. SELECT   
  2. [Extent1].[ParentID] AS [ParentID],   
  3. [Extent1].[NameAS [Name]  
  4. FROM [dbo].[Parent] AS [Extent1]  
  5. WHERE N'Lingzhi'=[Extent1].[Name

在EF 4.1中,我们可以直接调用DbQuery<>的ToString()方法得到所生成的SQL。

  1. using (var context = new MyDbContext())  
  2. {  
  3.     var people = from p in context.People  
  4.                  where p.PersonID > 100  
  5.                  select p;  
  6.  
  7.     string sql = people.ToString();  
  8. }  

所生成的SQL是:

  1. SELECT   
  2. [Extent1].[PersonID] AS [PersonID],   
  3. [Extent1].[NameAS [Name]  
  4. FROM [dbo].[People] AS [Extent1]  
  5. WHERE [Extent1].[PersonID] > 100  

大家应该已经猜到,这里的ToString()方法其实也就是调用了ObjectQuery<>的ToTraceString()方法。DbQuery<>.ToString() ==> System.Data.Entity.Internal.Linq.InternalQuery<>.ToString()方法,此方法在.NET Reflector得到的实现是这样的:

  1. public override string ToString()  
  2. {  
  3.     return this._objectQuery.ToTraceString();  
  4. }  

以上讨论的方法都只能得到普通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。

原文链接:http://www.cnblogs.com/LingzhiSun/archive/2011/05/05/EF_Trick5.html

【编者推荐】

  1. DataTable导致约束未启用
  2. Oracle的安全标记算不算bug
  3. SQL Server数据库迁移偏方
  4. PDF.NET数据开发框架实体类操作实例之在PostgreSQL中操作
  5. 优化你的DiscuzNT,让它跑起来
责任编辑:艾婧 来源: 博客园
相关推荐

2011-04-06 10:53:36

MySQL

2013-09-08 22:40:38

EF Code Fir数据查询架构设计

2017-09-07 16:20:39

SQL查询语句查询优化

2022-07-28 09:13:30

MySQL数据库

2010-11-25 15:36:09

MySQL查询结果集

2010-07-09 11:34:51

SQL Server用

2020-07-13 07:10:09

SQLSQL语句查询

2024-09-13 17:06:54

EF Core分组查询

2016-08-23 13:35:22

MVCEFNuGet

2024-04-10 12:56:00

C#批量插入开发

2010-09-26 13:40:14

SQL查询

2017-07-12 13:04:23

数据库SQL查询执行计划

2016-12-15 09:58:26

优化SQL高性能

2010-12-21 09:47:45

SQL Server

2010-07-19 16:52:23

SQL Server

2009-04-28 09:38:53

SQL优化物理查询

2022-02-11 14:43:53

SQL语句C/S架构

2010-09-26 13:56:43

SQL远程查询

2010-09-09 10:32:24

SQL函数拼音

2009-05-31 09:25:03

SQL Server脚本数据库管理
点赞
收藏

51CTO技术栈公众号