2012-02-07 28 views
7

什麼是明智地編寫查詢性能的最佳方式。例如我可以寫查詢以獲得關於特定姓氏的所有聘用過的員工爲後續什麼是在實體框架中編寫查詢的最佳方式

ObjectQuery<Employee> queryEmp = 
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName", 
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly); 

OR

var v = from e in context.Employees where e.LastName == "Farooqi" select e; 

OR

context.Employees.Where(e => e.LastName == "Farooqi"); 

OR

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 

我的問題是這一點,哪種查詢方法最好。 我感到困惑的是,我認爲(但不是很確定)使用除第一個之外的最後三種方法將從數據庫中提取所有員工記錄,然後通過枚舉所有記錄來滿足指定條件的記錄,所以我認爲最後三種方式比第一種方式需要更多時間,所以我只用了第一種。 但實際上我不知道最好的一個是什麼。 是否所有方法只抓取滿足條件的數據庫記錄或從數據庫獲取所有記錄,然後枚舉以在應用程序結束時返回已過濾的記錄?

回答

9

沒有什麼區別; 2nd/3rd在編譯時具有強制類型正確性的優勢,因爲如果LastName不存在或者(比如說)是int,則表達式樹不會編譯 - 避免拼寫錯誤和「魔術字符串」問題。

重新設想你將所有東西都帶回來;沒有。第二個/第三個編譯爲表達式樹,可以將其解構並用於創建正確的SQL(在服務器上執行過濾器)。非常聰明,但經常被誤解。關鍵是這是Queryable.Where(取Expression<Func<T, bool>>),而不是Enumerable.Where(取Func<T, bool>)。隨意進行追蹤。

同樣,第一/第四之間幾乎沒有什麼區別 - 兩者都會在服務器上過濾。

相關問題