據我所知,它基本上從數據源中檢索所有客戶,然後通過給定的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'
那麼,這隻會創建一個查詢,並不會立即執行? – Stack0verflow
速度取決於郵政編碼列是否在數據庫中編制索引。 – danludwig