2010-12-22 45 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。试一试。