2012-07-17 74 views
5

我們首先使用EF 4.3代碼選擇並有一個對象模型像這樣:實體框架表 - 僅由基型柱

class Content { } 

class Product:Content { } 

class News:Content { } 

這些被映射爲每個類型表。

有些情況下,我只想加載屬於基表的列,比如說所有內容標題的列表。但是,像

from c in Content 
where c.IsDeleted == false 
select c 

結果與一些真正討厭的SQL查詢連接到其他兩個表。有沒有什麼辦法強制EF只從基表中進行選擇而不加入其他表?

回答

3

TPT有問題,EF生成的查詢通常效率很低。而且你的期望可能不正確。 Linq-to-entities總是返回實體的實際類型。如果記錄實際上是Product實體,則它不能返回Content類型的實例。您的查詢只能有兩個含義:

  • 返回所有未刪除的內容 - 這必須執行連接才能正確實例化實際類型的實體。查詢將返回枚舉ContentProductNews實例。 (這與ProductNews沒有關係)。沒有記錄映射到ProductNews將在枚舉中返回。這個查詢不可能用於Linq-to-entities - 您需要使用ESQL和OFTYPE ONLY運算符。

有一些事情你可以嘗試:

  • 升級到.NET 4.5 - 有一些改進的TPT查詢
  • 性質的迴歸突而非Content - ProductNews也是內容所以如果你返回Content實例從Linq到實體查詢
+0

感謝你的一堆爲你響應。對於我們正在開發的當前正在進行的項目而言,升級到4.5是不可能的,而這個項目本應在下個月開始實施。我們正計劃用存儲過程來做這樣的查詢。 – madaboutcode 2012-07-17 14:35:04