2010-12-22 85 views
1

使用Visual Studio的O/R設計器,我創建了許多從基類繼承的類(名爲SCO)。使用泛型與LINQ繼承

繼承的類型有一個鑑別符屬性TypeId這是一個包含類型名稱的字符串。例如,繼承的類Blog將具有BlogTypeId屬性。

我希望能夠創建一個返回任何特定繼承類型的強類型集合的方法。我的這個方法嘗試如下:

public static IQueryable<T> GetSCOs<T>(SCODataContext dc) where T : SCO 
{ 
    string targetType = typeof(T).Name; 
    IQueryable<T> scos = from s in dc.SCOs 
         where s.TypeId == targetType 
         select s; 
    return scos; 
} 

當我試圖編譯這個方法,我得到以下錯誤...

_Cannot implicitly convert type 'System.Linq.IQueryable<SCOs.SCO>' to 'System.Linq.IQueryable<T>'. An explicit conversion exists (are you missing a cast?)_

我(覺得)我明白這是爲什麼發生,但一直無法找到解決方案。任何建議,指導將非常感激。

+2

如果問題解決了,請將答案標記爲已接受,這樣可以防止其他用戶添加更多可能錯誤的答案,並且還可以幫助其他用戶查找答案而不是詢問自己的問題。 – 2010-12-22 09:47:34

+0

使用泛型時人們會忘記的事情是,它們需要在編譯時知道,否則編譯器不能保證類型安全(這是使用泛型的全部要點)。另一方面,LINQ查詢運行JIT,因此您使用的方法會爲編譯器帶來一些問題,因此在您的錯誤消息中會出現`IQueryable `。 – 2010-12-22 11:25:30

回答

7

試試這個:

public static IQueryable<T> GetSCOs<T>(SCODataContext dc) where T : SCO 
{ 
    return dc.SCOs.OfType<T>(); 
} 

Works的LINQ實體,不知道這是否適用於LINQ-SQL。試一試。