2012-03-07 54 views
1

在我的數據庫中有查看「RqstLst」 我從數據庫創建EF模型。現在我有實體RqstLst。實體框架長時間運行查詢

有相同的查詢

public void MyMethod() 
{ 
    context = new WaterMEntities(); 
    var query = context.RqstLst; 
    dgRqstLst.ItemsSource = query; //dgRqstLst - DataGrid in WPF 
} 

public void MyMethod() 
{ 
    dgRqstLst.ItemsSource = this.GetRqstLst(); 
} 
private IEnumerable<RqstLst> GetRqstLst() 
{ 
     context = new WaterMEntities(); 
     string nativeSQLQuery = "SELECT * " + 
            "FROM dbo.RqstLst "; 
     ObjectResult<RqstLst> requestes = 
      context.ExecuteStoreQuery<RqstLst>(nativeSQLQuery); 
     return requestes; 
} 

執行時間第一變型(LINQ到實體)兩種變型19秒,對於第二,小於1秒。 我在sql server profiler中查看它。我在第一個變體中做錯了什麼?

+1

作爲一個完整的側面問題/觀察;將元音從單詞中刪除並將其用作數據表/視圖名稱(即RequestList - > RqstLst)的人應該被取出並拍攝;) – 2012-03-07 18:10:44

+1

我已經有了查看請求列表。 RqstLst只是爲了測試。所以很抱歉,「拍」也許是另一次,另一個原因..;) – AntonL 2012-03-07 18:17:12

回答

1

一個很大的區別是ExecuteStoreQuery不會將返回的對象附加到上下文(至少不是您正在使用的重載),但是您的第一個查詢會(這會花費時間)。

嘗試定義在第一個查詢相同的跟蹤行爲,就像你在第二個查詢有(= NoTracking):

context = new WaterMEntities(); 
context.RqstLst.MergeOption = MergeOption.NoTracking; // in System.Data.Objects 
var query = context.RqstLst; 
dgRqstLst.ItemsSource = query; 
+0

當然值得做必要的事情,但我無法想象這是18秒延遲的來源。另外他提到使用sql server profiler來查看執行時間,這表明減速並非來自後處理。 – Ocelot20 2012-03-07 18:11:13

+0

@ Ocelot20:我也不相信它會持續18秒。對不起,我沒有注意到他在SQL中的執行時間已經不同了。 (他可以顯示SQL中的差異。)但是,您的答案是一個很好的猜測! – Slauma 2012-03-07 18:21:59

+0

@Slauma,謝謝。它真的幫助。現在執行時間與第一個和第二個選項相同 – AntonL 2012-03-07 18:36:39

1

你沒做什麼與第一個選項,但根據在您的配置上,第一個生成的查詢可能比您的直接SQL執行復雜得多。您是否使用分析器來查看第一個查詢生成的SQL究竟是什麼?例如,如果RqstLst碰巧是一個使用TPT繼承的抽象基類,則生成的SQL可能會很大。

+0

是的,我用探查器什麼realy發生'dgRqstLst.ItemsSource =查詢;'然後複製它並在管理工作室中執行。它執行少於1秒 – AntonL 2012-03-07 18:30:04