2012-07-13 29 views
3
class User { 
    public int Id {set;get;} 
    public int ExternalId {set;get;} 
} 

我已經定義了這個類。我首先使用代碼EF。如何通過where子句用EF代碼先查詢

public class FooContext : DbContext { 
    public DbSet<User> Users { set; get; } 
} 

所以,當我做到以下幾點:

db.Users.ToList().where(x=>x.ExternalId == externalId); 

我很好奇,如果這樣做如下:

select whatever from Users where ExternalId = 'id I passed in'; 

,或者所有用戶加載到內存並執行的Linq在記憶中?

查詢帶有條件(where子句)的表的最佳做法是什麼?

回答

9

ToList()調用將導致EF將所有用戶記錄從DB中拉回。您對Where擴展方法的調用將針對內存中的集合運行。如果你改變你的電話的順序,它只會從數據庫中選擇需要的記錄,像這樣:

db.Users.Where(x=>x.ExternalId == externalId).ToList(); 

這是因爲實體框架使用延遲執行。在調用代碼中枚舉實際記錄之前,不會發生對數據庫的調用。在您使用結果之前,查詢只是一個等待執行的表達式樹。如果你看看Where()方法,它的返回類型是IQueryable。當你調用ToList()時,你基本上是從表達式樹(IQueryable)轉換爲一個通用的用戶列表。這要求EF運行db查詢以返回結果。

+0

而不是.ToList(),我沒有.First(),因爲我只想找到第一個記錄。 – SamekaTV 2014-01-02 10:52:57