2010-06-28 45 views
1

我一直在尋找方法來執行linq查詢來獲取基於特定的子繼承類型的對象圖。我可能會說這有點不對,但我會盡力解釋。c#linq查詢每個類型的EF4表的查詢問題繼承

可以說我有一個EF4模型,它有一個城市實體,一個細分實體,一個房子實體和一個特徵實體。這個城市與細分有着一對多的關係。細分與房屋有一對多的關係。而且房子與特徵之間有一對多的關係。兩個實體子類型的特徵實體。讓我們稱他們爲游泳池和車道。

什麼是c#linq查詢將查詢對象圖的所有城市有一個功能的房屋.OfType「池」與城市在圖的根?

類似於: var cities = from city in context.Cities其中??????選擇城市

回答

1

您需要使用IQueryable.OfType方法來限制您實際感興趣的類型。 EF4 IQueryable提供程序將負責其餘部分,併爲您生成正確的SQL查詢。

Queryable.OfType<T>

下面的查詢應該工作(假定你把所有在模型中定義的適當導航關係):

var cities = from city in context.Cities 
      from house in city.Houses 
      from pool in house.Features.OfType<Pool> 
      where pool.MaxDepth == 6 
      select city; 
+0

非常感謝你。上面的查詢運行良好。它確實返回了同一個載體的多個實例,所以我在最後添加了一個distint。你知道如何加載圖表嗎?我試圖像通常那樣使用.Include(「導航路徑」),但是這並沒有返回圖中的任何子對象。 var cities = from city in context.Cities.Include(「Houses.Features.Pools」)... 很明顯,我是這個新手。 – 2010-06-29 14:50:12

+0

你幾乎擁有它,但你犯了一個錯誤。游泳池是功能...功能沒有游泳池。您的包含路徑需要如下所示:'context.Cities.Include(「Houses.Features」)',並且包含所有功能。 House類型的Features屬性代表所有功能,始終。您無法選擇性地僅使用一些功能填充該集合......隨意說出Pools ...。您需要創建一個Pools屬性來表示實現該關係的適當關係類型。 – jrista 2010-06-29 16:41:26

+0

Jrista - 再次感謝您的幫助。你當然澄清了我如何思考/查詢「特徵」層次結構。 我確實發現即使使用建議的更改,Include命令也沒有執行。我做了一個額外的搜索,並提出了這篇文章。解決了問題後。看起來像是一個錯誤或者某些「早期」包含請求正在丟失。 http://stackoverflow.com/questions/936558/linq-to-entity-framework-eager-loading-issue 問候, DaveW – 2010-06-29 17:42:37