[英]How to user “Where” in “Include” and “Select” query in Entity Framework 6
在我的數據庫中,我有3
表, Exams
、 ExamPlaces
、 Agents
。 Exams表中每個考試的 Id 是ExamPlaces表中的外鍵,每個考試地點的 Id 是Agents表中的外鍵。 我想退回特定代理的所有考試。 我試圖像這樣返回考試:
return _db.Exams
.Include(e => e.ExamPlaces.Select(a => a.Agents
.Where(agent => agent.AgentId == supervisorId))).ToList();
但我收到以下錯誤:
包含路徑表達式必須引用在類型上定義的導航屬性。 對參考導航屬性使用虛線路徑,對集合導航屬性使用 Select 運算符。 參數名稱:路徑
是否可以像使用“ Include
”一樣使用“ Where
”子句來檢索數據?
欣賞
Include 不會影響返回哪些記錄。 它支持預先加載指定的導航屬性。 從本質上講,這是一種說法,“是的,我想要一些考試,但我稍后也會使用相應的 ExamPlaces,所以提前 go 並立即從數據庫中獲取它們以節省時間”。 它與Where無關。
在這種特殊情況下,很難使用 Where 。 這與包含無關。 如果您真的想從 _db.Exams 開始並使用 Where,我認為您可以在 Where 之前的某處放置 Join 以使其正常工作。
但是,反過來想這個查詢。 你已經有了你想要的代理。 該代理有一個ExamPlaces 集合,每個ExamPlaces 都有一個Exams 集合。 您只需要將它們展平到一個列表中。 像這樣的東西應該可以工作(不檢查語法錯誤):
return _db.Agents
.Find(supervisorId)
.ExamPlaces
.SelectMany(p => p.Exams)
.Include(e => e.ExamPlaces.Select(p => p.Agents))
.ToList();
如您所見,EF 6 不支持在Include
方法中進行過濾。
免責聲明:我是Entity Framework Plus項目的所有者
EF+ Query IncludeFilter (免費和開源)允許輕松過濾包含的實體。
要使用它,您只需將所有“包含”替換為“包含過濾器”。 此時您還需要在每個級別上使用 IncludeFilter。
例子:
return _db.Exams
.IncludeFilter(e => e.ExamPlaces)
.IncludeFilter(e => e.ExamPlaces.Select(a => a.Agents
.Where(agent => agent.AgentId == supervisorId))).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.