C# 使用具有LINQ继承的泛型

C# 使用具有LINQ继承的泛型,c#,linq-to-sql,generics,C#,Linq To Sql,Generics,使用VisualStudio的O/R设计器,我创建了许多从名为SCO的基类继承的类 继承的类型具有鉴别器属性TypeId,该属性是包含类型名称的字符串。例如,继承的类Blog将具有Blog的TypeId属性 我希望能够创建一个方法,返回任何特定继承类型的强类型集合。我对这种方法的尝试如下: public static IQueryable<T> GetSCOs<T>(SCODataContext dc) where T : SCO { string targetT

使用VisualStudio的O/R设计器,我创建了许多从名为SCO的基类继承的类

继承的类型具有鉴别器属性TypeId,该属性是包含类型名称的字符串。例如,继承的类Blog将具有Blog的TypeId属性

我希望能够创建一个方法,返回任何特定继承类型的强类型集合。我对这种方法的尝试如下:

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;
}
当我尝试编译此方法时,我得到以下错误

_无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换。是否缺少强制转换_

我想我理解为什么会发生这种情况,但一直无法找到解决办法。任何建议和指导都将不胜感激。

试试以下方法:

public static IQueryable<T> GetSCOs<T>(SCODataContext dc) where T : SCO
{
    return dc.SCOs.OfType<T>();
}
适用于LINQ实体,但不确定是否适用于LINQ-SQL。试试看。

试试这个:

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

适用于LINQ实体,但不确定是否适用于LINQ-SQL。试试看。

这太棒了。我打算用dc.SCOs.Wheres=>s表示T.Cast;但这更好!Sweet-我感觉它会起作用,因为该方法来自LINQ对象API。别忘了勾选正确答案。这太棒了。我打算用dc.SCOs.Wheres=>s表示T.Cast;但这更好!Sweet-我感觉它会起作用,因为该方法来自LINQ对象API。别忘了勾选正确答案。如果答案解决了问题,请将其标记为已接受,这可以防止其他用户添加更多可能错误的答案,也有助于其他寻找答案的用户找到您的问题,而不是询问他们自己的问题。人们在使用泛型时忘记的一点是,他们需要在编译时知道,否则编译器无法保证类型安全,而这正是使用泛型的全部意义。另一方面,LINQ查询是JIT运行的,因此您使用的方法会给编译器带来一些问题,因此错误消息中会出现IQueryable。如果解决了问题,请将答案标记为已接受,这可以防止其他用户添加更多可能错误的答案,也有助于其他寻找答案的用户找到您的问题,而不是询问他们自己的问题。人们在使用泛型时忘记的一点是,他们需要在编译时知道,否则编译器无法保证类型安全,而这正是使用泛型的全部意义。另一方面,LINQ查询是JIT运行的,因此您使用的方法会给编译器带来一些问题,从而导致错误消息中的IQueryable。