2017-03-03 46 views
-1

我有一個使用EF6的通用存儲庫。這個問題與需要「包含」的關聯屬性有關,即使它不應該。以下作品:實體框架存儲在var中的Lambda謂詞與關聯

IQueryable<User> dbQuery = _db.Set<User>(); 
return dbQuery.Where(x => x.Child.Name == "Foo").ToList(); 

但是,以下不工作:

Func<User, bool> filter = x => x.Child.Name == "Foo"; 
IQueryable<User> dbQuery = _db.Set<User>(); 
return dbQuery.Where(filter).ToList(); 

它拋出一個「對象未設置...」異常的兒童。

下解決它:

Func<User, bool> filter = x => x.Child.Name == "Foo"; 
IQueryable<User> dbQuery = _db.Set<User>(); 
dbQuery = dbQuery.Include(x => x.Child); 
return dbQuery.Where(filter).ToList(); 

我不明白爲什麼這是必要的,但。任何人都知道一種方法來解決這個問題,而不使用「包含」?

回答

2

您應該使用Expression來讓EF提供者解析您的查詢。

更改Func<User, bool>Expression<Func<User, bool>>

+0

哇,這很快。乾杯,它的工作! –

0

第一個代碼段被提供到ExpressionWhere,其被翻譯成SQL,並做在數據庫中的整個操作。後兩者將編譯的方法傳遞給Where,它不能轉換成SQL,這意味着整個數據庫表都被下拉到內存中,並且整個操作都在應用程序中運行。當你拉下整個桌子時,它不會拉下相關的記錄,除非你是Include

該解決方案不是拉下整個表格以及所有相關記錄中的所有數據;解決方案是在數據庫中而不是在應用程序中進行過濾。