首页 运维 正文
如何得到EF查询生成的SQL

 2022-10-23    368  

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

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

如何得到EF查询生成的SQL

using(varcontext=newTestDBEntities()) 
{ 
varquery=frompincontext.Parents 
wherep.Name=="Lingzhi" 
selectp; 

ObjectQuery<Parent>parents=queryasObjectQuery<Parent>; 
if(parents!=null) 
{ 
stringsql=parents.ToTraceString(); 
} 
}

这里所生成的SQL为:

SELECT 
[Extent1].[ParentID]AS[ParentID], 
[Extent1].[Name]AS[Name] 
FROM[dbo].[Parent]AS[Extent1] 
WHEREN'Lingzhi'=[Extent1].[Name]

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

using(varcontext=newMyDbContext()) 
{ 
varpeople=frompincontext.People 
wherep.PersonID>100 
selectp; 

stringsql=people.ToString(); 
}

所生成的SQL是:

SELECT 
[Extent1].[PersonID]AS[PersonID], 
[Extent1].[Name]AS[Name] 
FROM[dbo].[People]AS[Extent1] 
WHERE[Extent1].[PersonID]>100

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

publicoverridestringToString() 
{ 
returnthis._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。

原文链接:https://77isp.com/post/6993.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。