2016-08-16 64 views

回答

2

你不能得到你想要的。但可以估計。實體框架需要執行查詢時,幾個動作,如:

  1. 元數據加載
  2. 視圖生成
  3. 參數評測
  4. 查詢翻譯
  5. Materializer代
  6. 數據庫查詢執行
  7. 對象實現
  8. 標識lo

    1. 查找
    2. :okup

    但是,當你執行溫暖查詢(第二查詢執行)大部分負荷查找如下取代

  9. 查看查找
  10. 參數評測
  11. 查詢查找
  12. Materializer 查找
  13. 數據庫查詢執行
  14. 對象具體化
  15. 身份查找

在這種情況下,大部分步驟的成本是,但:

  1. 數據庫查詢執行 - 潛在的高
  2. 對象物化 - 中
  3. 身份查詢 - 中。

,你可以在這裏做什麼是執行溫暖查詢,計算花費的時間,然後從總時間減去查詢執行時間和2(因爲兩個中等成本)除以它。是的,我知道這將是非常粗糙的結果,但它從無到有更好:)。以下是演示:

// Let Entity Framework to load metadata, generate views and etc. 
using (TestContext context = new TestContext()) 
{     
    var query = context.Set<Message>().AsNoTracking(); 
    Message first = context 
     .Set<Message>() 
     .AsNoTracking() 
     .FirstOrDefault(); 
} 

// Execute warm query 
using (TestContext context = new TestContext()) 
{ 
    // Log the queries to be able to subtract query execution time. 
    context.Database.Log = Console.WriteLine; 

    var query = context.Set<Message>().AsNoTracking(); 

    Stopwatch stopwatch = new Stopwatch(); 
    stopwatch.Restart(); 

    Message first = query.FirstOrDefault(); 

    stopwatch.Stop(); 
    Console.WriteLine("Elapsed {0} milliseconds.", stopwatch.ElapsedMilliseconds); 
} 

然後你就可以從總時間減去查詢執行時間(原木)和2

把它見this link獲取更多信息。

+0

我認爲這是一個合理的方法。實體生成不僅僅包括生成CLR對象。關係修正也會發生(即使使用'AsNoTracking',我猜這是一個相對昂貴的過程。即使我們有適當的鉤子(我們沒有),也很難得到所有這些步驟的詳細測量結果。黑盒子的方法是最好的,我們可以得到。 –

+0

感謝支持@GertArnold) –