簡體   English   中英

如何在實體框架 6 中的“包含”和“選擇”查詢中使用“位置”

[英]How to user “Where” in “Include” and “Select” query in Entity Framework 6

在我的數據庫中,我有3表, ExamsExamPlacesAgents 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM