程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 如何得到EF查詢生成的SQL

如何得到EF查詢生成的SQL

編輯:關於SqlServer
 

最近挺忙的,只能為大家帶來一些使用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. ObjectQuery<Parent> parents = query as ObjectQuery<Parent>;
  7. if (parents != null)
  8. {
  9. string sql = parents.ToTraceString();
  10. }
  11. }

這裡所生成的SQL為:

  1. SELECT
  2. [Extent1].[ParentID] AS [ParentID],
  3. [Extent1].[Name] AS [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. string sql = people.ToString();
  7. }

所生成的SQL是:

  1. SELECT
  2. [Extent1].[PersonID] AS [PersonID],
  3. [Extent1].[Name] AS [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。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved