2010-06-16 74 views
1

我有一個視圖,AdvertView在我的數據庫中,這個視圖是一些表(廣告,客戶,屬性)之間的簡單連接。然後,我有一個簡單的LINQ查詢來獲取所有廣告的客戶:在linq上迭代sql查詢很慢

public IEnumerable<AdvertView> GetAdvertForCustomerID(int customerID) 
{ 
    var advertList = 
     from advert in _dbContext.AdvertViews 
     where advert.Customer_ID.Equals(customerID) 
     select advert; 
    return advertList; 
} 

話,我想這個到modelItems我的MVC應用程序:

public List<AdvertModelItem> GetAdvertsByCustomer(int customerId) 
{ 
    List<AdvertModelItem> lstAdverts = new List<AdvertModelItem>(); 
    List<AdvertView> adViews = _dataHandler.GetAdvertForCustomerID(customerId).ToList(); 
    foreach(AdvertView adView in adViews) 
    { 
     lstAdverts.Add(_advertMapper.MapToModelClass(adView)); 
    } 
    return lstAdverts; 
} 

我期待有一些性能問題與SQL,但問題似乎與.ToList()函數。我使用的是ANTS性能分析器,它報告函數的總運行時間是1.400ms,其中850個是ToList()。所以我的問題是,爲什麼tolist功能需要這麼長時間?

回答

3

GetAdvertForCustomerID不返回結果,它返回一個查詢。

ToList枚舉查詢。當時的結果是水合的。數據庫之旅正在ToList調用中發生。

您應該獲取生成的sql(通過使用SqlProfiler或DataContext.Log屬性),並將其帶到查詢分析器以檢查執行計劃和IO(SET STATISTICS IO ON)。

+0

大衛非常正確。國際海事組織你應該隱式返回IQueryables。返回'List '或'T []'或使用'IQueryable '作爲方法定義的返回類型。這就明確了將會發生什麼。 – Steven 2010-06-16 11:47:06

+0

我沒有任何牛肉與該方法的返回類型。基本的linq事實是查詢在枚舉時執行。 ToList枚舉它的來源。在知道代碼行按順序執行的情況下,這些知識在linq世界中是至關重要的。 – 2010-06-16 11:55:42

+0

在我之前的評論中輸入錯字。它應該閱讀「你不應該隱式返回IQueryables」。 – Steven 2010-06-16 12:09:12

1

.ToList將執行查詢,以便包含整個數據庫往返,獲取數據以及爲返回的每條記錄實現實體對象......您最有可能花費大部分時間db端,所以仔細看看你的視圖的執行計劃。

+0

DB側執行時間(根據SqlServer profiler = 0,有139個IO操作。 – devzero 2010-06-16 13:16:24