2010-01-29 44 views
0

我認爲我可以問這個問題最簡單的方法是用一個例子:假設我有一個實體框架模型和一個「Order」實體,它有一個「OrderLines 「收集。 「OrderLines」集合表面上是OrderLine對象的集合,但我在此處使用繼承,因此集合中對象的實際類型將爲NoteOrderLine,ItemOrderLine等。此外,ItemOrderLine實體具有關聯的「Item 「 實體。通過LINQ到實體查詢預取繼承實體的成員

我希望能夠做的是創建一個基於「Order」實體的LINQ查詢,預取「OrderLines」集合,並在「OrderLine」實體的情況下預取「Item」實體實際上是「ItemOrderLine」類型。有沒有人知道這一點?

非常感謝。

回答

2

你可以用投影做到這一點:

var q = from o in Context.Orders 
     select new 
     { 
      Customer = o.CustomerName, 
      Lines = from l in o.Lines 
        let i = l as ItemOrderLine 
        select new 
        { 
         Quantity = l.Quantity, 
         Item = i.Item.Name, 
         ItemNo = (int?) i.Item.Number // Note below 
        } 
     }; 

i將是空的時lNoteOrderLine類型。由於int不可爲空,因此我們必須將其轉換爲int?,以便在設置ItemNo時可以合併空i

您也可以使用實體類型來做到這一點,但它不同。既然你沒有給出你想寫的那種代碼的例子,我猜。

+0

感謝您的答覆,克雷格。就你所知,在沒有使用預測的情況下,沒有辦法完成我所問的內容。或者,你的意思是「你可以用實體類型來做到這一點......」? – 2010-01-29 20:59:43

+0

我不太確定。但是你可以通過投影*那些*來返回實體類型。因爲實體框架修復了查詢中返回的所有實體的引用,包括投影的一部分中的實體也會使其顯示在其他部分中。因此,例如,如果您在某個地方投射出「Item」,它也會顯示爲「ItemOrderLine」的屬性。 – 2010-01-29 21:32:25