2009-09-24 67 views
2

我知道關於協變性,而且我知道一般情況下,直到4.0版本纔可能在C#中使用。可能轉換IQueryable <Derived>到IQueryable <Base>?

但是我想知道一個具體的案例。有沒有辦法通過創建一個實際上不執行查詢的包裝類來轉換IQueryable<Derived>IQueryable<Base>,但實際上可以「傳遞」.Where<>()調用?

我的使用案例是,我正在嘗試處理具有許多類似表的數據庫模式。大多數字段是相同的,並且需要在每個表格上查詢許多常用字段。我正在使用LinqToSql。我希望避免重複每個表的所有查詢。

回答

5

以下是你在找什麼?

var results = queryable.OfType<Base>.Where(...); 

的OfType方法收集起來什麼,是指定類型的,如果集合中的所有項目類型的基地無論是,還是從基礎型衍生,他們應該晉級。在隨後的地方,所有項目都是Base類型。

+0

哇。現在我覺得很愚蠢。那麼,那看起來正是我所需要的。謝謝。 – recursive 2009-09-24 23:07:59

+0

沒問題。 :) 很高興我能幫上忙。 – jrista 2009-09-24 23:08:34

0

下也將工作,altough它不太漂亮:

var results = queryable.Select(derived => (Base)derived).Where(...); 
+0

應該指出,如果派生實際上不是基類型,這將失敗。如果該集合包含各種不一定來自公共基礎的對象,則OfType 將安全地跳過那些未能投射的對象,並繼續。 – jrista 2009-10-16 22:10:21

相關問題