2014-01-06 65 views
0

所以我通過實體框架5來建立。我在數據庫中有一個Customers表。例如94023,獲得給定郵政編碼的客戶的最有效方法是什麼?我有這樣的:實體框架通過郵政編碼獲取客戶

var customersOfLosAltos = 
    (myDbContext.CreateObjectSet<Customer>()).Where(c=>c.Zip == "94023"); 

但是,直覺,這似乎非常低效的,因爲據我所知,它基本上從數據源中檢索所有的客戶,然後通過給定的ZIP篩選出來。如果我只有幾百個客戶可能會好,如果我有一百萬個客戶呢?

有什麼想法?謝謝。

+0

那麼,這隻會創建一個查詢,並不會立即執行? – Stack0verflow

+0

速度取決於郵政編碼列是否在數據庫中編制索引。 – danludwig

回答

5

據我所知,它基本上從數據源中檢索所有客戶,然後通過給定的zip進行過濾。

你的理解是錯誤的。實體框架變成了一個SQL查詢你的代碼,所以什麼服務器實際上返回是查詢

select * from Customer where Zip = '94023' 

結果如果現在改變你的代碼

var customers = myDbContext.CreateObjectSet<Customer>().ToList(); 
var customersOfLosAltos= customers.Where(c=>c.Zip == "94023"); 

然後因爲這個.ToList()它對數據庫進行未經過濾的查詢,然後在客戶端的內存過濾器中僅對您想要的客戶進行過濾。這就是爲什麼你想在獲得結果之前儘可能長時間地將查詢保留爲IQueryable,因爲對查詢所作的任何調整或更改都會傳播回服務器上執行的查詢。

爲了使您的查詢更有效率,你可以添加一個Select條款

var lastNamesOfCustomersOfLosAltos = (myDbContext.CreateObjectSet<Customer>()) 
             .Where(c=>c.Zip == "94023") 
             .Select(c=>c.LastName); 

的SQL服務器現在執行的查詢(當您通過ToList() retreive的結果,或在foreach,或通過.AsEnumerable() ,等)

select LastName from Customer where Zip = '94023' 
+0

好吧,明白了。這回答了我的問題。謝謝。 – Stack0verflow