-1

想我的LINQ查詢像LINQ和生成的SQL

var qry = from c in nwEntitiesContext.CategorySet.AsEnumerable() 
      let products = this.GetProducts().WithCategoryID(c.CategoryID) 
      select new Model.Category 
      { 
       ID = c.CategoryID, 
       Name = c.CategoryName, 
       Products = new Model.LazyList<Core.Model.Product>(products) 

      }; 
return qry.AsQueryable(); 

我只是想知道什麼查詢它會在運行時生成....怎麼看到什麼查詢它從VS2010 IDE當我們運行產生在調試模式下的代碼....引導我一步一步來。

回答

2

嘗試Linqpad

+0

不使用linq pad我們無法看到生成的sql。因爲有時數據檢索速度很慢,那麼用戶肯定希望看到生成的是什麼SQL。請指教。 – Mou 2011-04-29 11:19:45

+0

@ user728750 - 您沒有顯示「GetProducts()」的代碼,但是如果您正在進行EF查詢以獲取具有某個categoryId的所有產品,則可能會導致針對** EVERY **'Category'的數據庫調用在DB中。在你調用'AsEnumerable'後,你處於對象空間(EF進行查詢並獲取所有類別)。之後,根據你所做的事情,你可以確實爲每個類別做一個數據庫查詢來解釋你所面臨的性能問題。您可以通過運行例如SQL來檢查SQL級別發生了什麼。 SQL事件探查器(請參閱我的答案)。 – Yakimych 2011-04-29 11:29:59

3

沒有多少在這裏看到 - 它只是選擇從Category表中的所有字段,因爲你叫AsEnumerable從而獲取所有從Category表中的數據到內存中。之後,你在物體空間。那麼,根據什麼this.GetProducts()做什麼 - 我的猜測是它使另一個EF查詢將結果提取到內存中。如果是這種情況,我強烈建議您使用此代碼和您的GetProducts方法的代碼發佈另一個問題,以便我們可以查看並以更優化的方式重寫此代碼。 (除此之外,你正投射到一個映射實體Model.Category,它不會(也不應該)與Linq-to-Entities一起工作。)

在閱讀您的查詢之前,我將推薦做這樣的事情:

string sqlQueryString = ((ObjectQuery)qry).ToTraceString(); 

但因爲你是使用LINQ到對象混合LINQ到實體將無法工作,你會真正有情況GetProducts執行多個查詢查詢EF。您可以將部分與EF查詢分開,看到這樣雖然SQL:

string sqlString = nwEntitiesContext.CategorySet.ToTraceString(); 

但正如我前面提到的 - 這將只需選擇一切從Categories表。在你的情況下(除非你以重大的方式重寫你的代碼),你實際上希望看到當你執行代碼並枚舉查詢結果時,針對數據庫運行的查詢。看到這個問題: exact sql query executed by Entity Framework

您的選擇是SQL Server ProfilerEntity Framework Profiler。您也可以嘗試LinqPad,但總的來說,我仍然建議您更詳細地描述您的查詢所做的事情(並且最有可能在繼續之前以更優化的方式重寫它們)。

+0

+1好答案。它應該被標記爲正確答案。 – 2011-04-29 12:22:44

0

這將產生SELECT * FROM Categories。而已。一旦你打電話給AsEnumerable你在Linq-to-objects中,並且沒有辦法返回到Linq-to-entities(AsQueryable不這樣做)。

如果您想查看生成的查詢,請使用SQL Profiler或this article中描述的任何方法。