2010-10-04 96 views
2

我想強類型使用linq to sql查詢3個ef對象。與產品和類別有一對多的關係。我的類包含導航屬性,看起來像這樣。我如何查詢導航使用linq到SQL的特性和ef

public partial class Product 
{ 

public int ID {get;set;} 
public string Name {get;set;} 
public virtual ICollection<Group> NpGroup {get;set;} 
} 

public partial class Category 
{ 
public int ID {get;set;} 
public string Name {get;set;} 
public virtual ICollection<Group> NpGroup {get;set;} 
} 

public partial class Group 
{ 
public int ID {get;set;} 
public int ProductID {get;set;} 
public int CategoryID {get;set;} 
public virtual Product NpProduct {get;set;} 
public virtual Category NpCategory {get;set;} 
} 

試圖避免基於.INCLUDE()的字符串,我將如何構建一個返回一組等於產品ID「1」,但也包含在產品和類別的名稱查詢?

喜歡的東西:

var context = ObjectContext.CurrentObjectContext; 
    var query = from c in context.Group 
    where c.ProductID == 1 
    //Include the names of the product and category of the group record (c.NpProduct.Name etc.) 
    select c; 

我可能丟失穿過森林樹木,但我似乎無法得到ObjectContext.LoadProperty的語法(如果這是正確的方式去)。

有什麼想法?謝謝。

回答

0

首先,我懷疑你使用的是都是 L2SQL和EF,所以儘量不要混淆人。

反正,與EF - 有兩種方法來加載的導航屬性:

1 - 預先加載

q.Include("NavPropertyName") 

2 - 顯式負載

*After* running your above query - use q.NavPropertyName.Load() 

不同的是選項2)導致2個查詢,選項1導致FK上的內連接。

我可以同情你不願意使用包括'魔術串' - 我不知道爲什麼EF團隊沒有讓他們強烈打字,但我確定有一個很好的理由。

有關加載/包括的更多信息here

HTH

+0

我已經試過您的兩個建議,我想我的問題是我的名單的返回類型檢查。在我上面的例子中,我試圖從('映射像')組對象引用中獲得每個產品及其屬性。我需要使用某種foreach循環嗎?感謝您的迴應。 – trevorc 2010-10-04 21:31:35

+0

是的,你的上面的查詢是'select c' - c是你的查詢中的一個別名。這只是一個IQueryable,我假設你正在做。最後ToList將把查詢投影到一個'List '中。您需要將投影更改爲您想要返回的內容。如果您需要產品,請從產品中選擇,而不是組(如您在查詢中所做的那樣)。 – RPM1984 2010-10-04 22:31:27

0

我想大家都討厭使用輸入字符串中在.include()語句。

我已經開始使用一個枚舉以表示該表的名稱,只是爲了避免拼寫錯誤等

我的約70臺的數據庫,我花了10分鐘。創建枚舉和我的linq現在是這樣的:

var context = ObjectContext.CurrentObjectContext; (TableEnum.Category.ToString()) 其中c.ProductID == 1 select c;

再次,並不完美,但至少它是由編譯器

+0

我沒有很好地解決我的問題。我試圖保持簡單。我真的想要得到的是 – trevorc 2010-10-05 19:51:33

+0

是的,我做了同樣的事情@弗內斯 - 我通過枚舉的[]到我的服務層。然後我使用擴展方法將其轉換爲一系列.Includes。 – RPM1984 2010-10-06 04:25:57