2011-06-21 102 views
2

我正在EF4.1上進行lambda選擇,包括我當前語句中的另一個相關DBSet。C#實體框架4.1 Lambda包含 - 僅選擇特定的包含值

return dbEntity.GameTypes.Include(a => a.Draws) 
          .Where(d => d.IsActive == true) 
          .ToList(); 

我有兩類:

//simplified versions of the classes 
public class GameType 
{ 
public Nullable<bool> IsActive { get; set; } 
public virtual ICollection<Draw> Draws { get; set; } 
} 

public class Draw 
{ 
public int DrawID { get; set; } 
public int GameTypeID { get; set; } 
public System.DateTime DrawDate { get; set; } 
} 

但我只希望每個遊戲類型的下一個即將到來的平局。基本上我想要做這樣的事情

return dbEntity.GameTypes.Include(a => a.Draws.Where(aw => aw.DrawDate > System.DateTime.Now) 
               .OrderBy(ao => ao.DrawDate) 
               .First()) 
          .Where(d => d.IsActive == true) 
          .ToList(); 

但它給我:

包含路徑表達式必須引用的類型定義的導航屬性。使用虛線路徑作爲參考導航屬性,使用Select運算符作爲集合導航屬性。

是這樣的事情可能或我需要過濾後的結果?然後,我還想通過最新的Draw.DrawDate命令得到總體結果。如果任何人都能以適當的方式向我展示我會變得格格不入。

+0

您可以做。僅包括導航屬性。 Peter Hancock的查詢很好,除非你不需要在該查詢中執行Include。 –

+0

我認爲這取決於是否啓用延遲加載和代理創建 - 如果它們是,則不需要包含 - 如果它們不是,則包含爲 –

+0

從EntityFramework 4.1開始,您必須使用System.Data.Entity:using System.Data.Entity ... MyDBContext.MySet.Include(o => o.MyAssociation) –

回答

0

來自MSDN的DbExtensions.Include()

路徑表達式必須由簡單的屬性訪問表達式 在一起 通過調用以便 選擇 後以構成附加包括:包括集合屬性。

所以我不認爲使用Where()是允許的。我不確定您是否可以對Include()進行任何篩選。

2

我想....

from g in dbEntity.GameTypes.Include("Draws") 
    where g.IsActive 
    let d = g.Draws.Where(o => o.DrawDate > System.DateTime.Now) 
        .OrderBy(o => o.DrawDate) 
        .Take(1)  // Needs to stay a collection 
    select new GameType {IsActive = g.IsActive, Draws = d} 

未經檢驗的 - 但它可能讓你在正確的道路上......

+0

我認爲這仍然會導致所有關聯的'Draws'。 –

+0

我不這麼認爲 - 繪圖正在被DrawDate過濾>現在,然後在'Take(1)' –

+0

之前排序,你不需要這樣做。在第一行包含 –

0

我從來沒有成功地找到一種方法來篩選孩子喜歡你想要做的。爲了減少從數據庫中檢索的數據量,我通常會檢索父對象,然後遍歷它們,只獲取我想要的孩子並將它們「附加」到父代。然而,這並不是一條硬性規定,這取決於每個家長有多少個孩子,以及他們可能希望保留的比例。