2010-10-24 45 views
2

如何使用實體框架編寫查詢,我需要使用產品,類別和父類別的列進行列表。我還沒有想出如何獲得父類別。任何幫助表示讚賞。 到目前爲止,我有以下幾點:實體框架簡單報告

from product in Products 
select new { Ctg = (from prdCategory in ProductCategories 
        where prdCategory.Products.Contains(product) 
        select prdCategory.CategoryName).FirstOrDefault(), 
      Name = product.ProductName 
      ParentCtg = ... 
    } 
+0

您能澄清,如果「父類別」是一個單獨的表或是ProductCategories表上的自引用列(如ProductCategory表上的ParentID FK引用ProductCategoryID PK)嗎? – 2010-10-24 22:20:56

+0

我應該提到父母是同一ProductCategories表中的自引用列。所以它是一對多的ProductCategoriesId:ParentProductCategoriesId。每個產品都有一個類別,每個類別都可以有父母。 – Mike 2010-10-24 23:58:26

回答

1

好吧,如果所有關聯已從您的數據庫設置正確那麼這將是一個簡單的查詢:

var product = from p in context.Products 
       select new { 
       Name = product.ProductName, 
       CategoryNames = p.ProductCategories 
         .Select(c => c.CategoryName).ToList(), 
       ParentCategories = p.ProductCategories 
         .Select(c => c.ProductCategory2.CategoryName).ToList() 
       }; 

當EF映射自引用協會,它創建了兩個相關的導航性能名爲ProductCategory1ProductCategory2。這些名稱都不是特別有用,其中一個導航屬性是指父類別或關係的0..1一側。另一個是指孩子或關係的一方。
要了解哪個是哪個,請右鍵單擊ProductCategory1,在屬性窗口中,ProductCategory1多重性是*(多),所以ProductCategory1代表爲孩子或子類(也它的導航屬性類型EntityCollection<ProductCategory>)和另一個 - ProductCategory2 - 表示此類別的父類別,它的類型爲ProductCategory。爲了您的查詢,我們對此感興趣。
除了 - 使您的查詢更具可讀性 - 你可以ProductCategory1小類ProductCategory2重命名爲ParentCategory

+0

我剛剛意識到它實際上是一個多對多的關係,所以我實際上得到的是p.ProductCategories,它是一個實體集合,而不是p.ProductCategory.CategoryName – Mike 2010-10-25 01:00:20

+0

好的,我們會照顧的,但父類別仍然同一ProductCategories表中的自引用列是否正確? – 2010-10-25 01:08:56

+0

是的,該類別的父類別是ProductCategories表中的自引用列。 – Mike 2010-10-25 01:28:31

0

如果我正確理解您的架構,應該是讓產品的普通列表的一個簡單的例子,你的顯示列表應該只是有「一欄thisProduct.Category .Name'顯示。