2011-03-09 46 views
6

我有類似下面的多對多關係表。EF Code First CTP5,使用包含方法與多對多表

public class Shop{ 
public int Id { get; set; } 
public virtual ICollection<ShopFacility> ShopFacilities { get; set; } 
} 

public class ShopFacility 
{ 
public int Id { get; set; }   
public int ShopId { get; set; } 
public int FacilityId { get; set; } 
public virtual Shop Shop { get; set; } 
public virtual Facility Facility { get; set; } 
} 

public class Facility 
{ 
public int Id { get; set; }   
public virtual ICollection<ShopFacility> ShopFacilities { get; set; } 
} 

和,獲取商店信息。

using (var context = new DataContext()) 
{ 
return context.Shops.Include(s => s.ShopFacilities) 
        .Include("ShopFacilities.Facility") // This line 
        .First(x => x.Id == id); 
} 

我想要做的就是使用Lambda表達式調用Include方法,而不是使用字符串進行多對多關係。我試圖實現像下面的代碼:

using (var context = new DataContext()) 
{ 
return context.Shops.Include(s => s.ShopFacilities) 
        .Include(s => s.ShopFacilities.Facility) // Cannot compile 
        .First(x => x.Id == id); 
} 

但是,你猜我不能編譯它。實際上,第一個代碼片段運行良好,所以基本上沒問題,不過,我有點好奇是否有解決辦法。

任何幫助,將不勝感激,

+2

只是想說,你並不需要ShopFacility類。您的商店類可以有一個「ICollection 」,您的Facility類可以有一個「ICollection 」。 EF Code First會明白你需要一個多對多的關係。 – 2011-03-09 14:46:49

+2

我知道EF代碼首先是非常聰明的,但實際上ShopFacility有其他一些屬性,如評論,費用等,所以我必須擁有它。我不願意提及它。不管怎樣,謝謝! – 2011-03-09 15:15:21

回答

16

試試這個:

return context.Shops.Include(s => s.ShopFacilities.Select(f => f.Facility)) 
       .First(x => x.Id == id);  

但是你應該遵循什麼@Kristof的評論建議。

+0

謝謝,這工作! – 2011-03-09 15:19:46

+1

強類型的Include()方法是一種擴展方法,所以你必須記得聲明'using System.Data.Entity;'語句。 – krzychu 2014-08-19 09:06:50