這篇將做個小實驗
關於Entity Framework的查詢運算式
使用Find與FirstOrDefault的差異
首先是關於Find的說明:DbSet.Find方法
可以看到它的查詢條件限定於Primary Key
並且是先從Cache中查詢
如果查不到,才到Database去查詢
所以若是查詢目標在Cache的狀況下,Find的效能是最快的
接著使用中文北風資料庫來測試一下
static void Main(string[] args) { EFEntities ef = new EFEntities (); int id = 2; for (int i = 0; i < 5; i++) { var find = ef.產品資料.Find(id); Console.WriteLine(find.產品); } Console.ReadKey(); }
上方程式碼進行了5次的Find
但透過SQL Server Profiler
可以看到實際只進行1次查詢 (其餘4次直接從Cache拿到結果)
再來試試FirstOrDefault
static void Main(string[] args) { EFEntities ef = new EFEntities(); int id = 2; for (int i = 0; i < 5; i++) { var firstOrDefault = ef.產品資料.FirstOrDefault(x=> x.產品編號 == id); Console.WriteLine(firstOrDefault.產品); } Console.ReadKey(); }
結果如下,5次都會對Database進行查詢
結論:
- 在允許使用Cache資料的狀況下,可以盡量使用Find提升效能
- 若查詢條件欄位非Primary Key,則要用其他方法 (之後會再介紹)
- Find所產生的SQL指令為什麼是Select Top 2 ?
請參考:Why does the Entity Framework’s DbContext.Find() generate a query with select top 2?
廣告