2012-05-17 74 views
0

這工作:實體框架不尊重懶評價

var user = db.Users.OrderByDescending(u => u.Id).FirstOrDefault(u => u.Email == "[email protected]" && u.Password == "8a79hjhfas8d7fd89"); 

它正確生成僅返回一個用戶的SQL語句。

下面的代碼理論上是相同的,它將所有用戶從數據庫中提取出來,並且僅在此之後應用過濾器。它的工作原理,如果我在做一個.ToList(),從而從數據庫評估一切,在一個普通的IEnumerable應用過濾器,而不是生成正確的SQL語句:

public static User Get(Func<User, bool> predicate) 
{ 
    return db.Users.OrderByDescending(u => u.Id).FirstOrDefault(predicate); 
} 

var user = User.Get(u => u.Email == "[email protected]" && u.Password == "8a79hjhfas8d7fd89"); 

這是實體中的錯誤框架或我錯過了什麼?

回答

1

您正在傳遞一個Func<>,這是一個已編譯的代理。相反,您應該傳入一個Expression<>作爲Get參數,該參數是一個語法樹,EF可以分析並生成查詢,而不是針對每個結果執行委託方法。

0

EF並不知道如何將任意Func委託轉換爲SQL,因此除了加載整個數據集並在結果集上運行謂詞之外別無選擇。