如何得到EF查詢生成的SQL
最近挺忙的,只能為大家?guī)硪恍┦褂肊F的小技巧。有關EF4.1的使用與探索將在之后一段時間為大家奉上。今天為大家?guī)砣绾蔚玫紼F查詢所生成的SQL。
在EF 4和EF 3.5 SP1中,我們可以使用ToTraceString()方法得到EF查詢所生成的SQL。
- using (var context = new TestDBEntities())
- {
- var query = from p in context.Parents
- where p.Name == "Lingzhi"
- select p;
- ObjectQuery<Parent> parents = query as ObjectQuery<Parent>;
- if (parents != null)
- {
- string sql = parents.ToTraceString();
- }
- }
這里所生成的SQL為:
- SELECT
- [Extent1].[ParentID] AS [ParentID],
- [Extent1].[Name] AS [Name]
- FROM [dbo].[Parent] AS [Extent1]
- WHERE N'Lingzhi'=[Extent1].[Name]
在EF 4.1中,我們可以直接調用DbQuery<>的ToString()方法得到所生成的SQL。
- using (var context = new MyDbContext())
- {
- var people = from p in context.People
- where p.PersonID > 100
- select p;
- string sql = people.ToString();
- }
所生成的SQL是:
- SELECT
- [Extent1].[PersonID] AS [PersonID],
- [Extent1].[Name] AS [Name]
- FROM [dbo].[People] AS [Extent1]
- WHERE [Extent1].[PersonID] > 100
大家應該已經(jīng)猜到,這里的ToString()方法其實也就是調用了ObjectQuery<>的ToTraceString()方法。DbQuery<>.ToString() ==> System.Data.Entity.Internal.Linq.InternalQuery<>.ToString()方法,此方法在.NET Reflector得到的實現(xiàn)是這樣的:
- public override string ToString()
- {
- return this._objectQuery.ToTraceString();
- }
以上討論的方法都只能得到普通Select查詢所生成的SQL,像其他Loading啊,更新啊,刪除啊,添加等所生成的SQL并不能得到。EF并不像LINQ to SQL有DataContext.Log可以得到所有被執(zhí)行的SQL命令。要實現(xiàn)這樣的功能,需要自己拓展一下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
【編者推薦】