【问题标题】:Possible to convert IQueryable<Derived> to IQueryable<Base>?可以将 IQueryable<Derived> 转换为 IQueryable<Base>?
【发布时间】:2010-12-01 06:27:58
【问题描述】:

我知道协方差,而且我知道通常在 v4.0 之前它在 C# 中是不可能的。

但是我想知道一个具体的案例。有没有办法通过某种方式创建一个实际上不执行查询但实际上可以“通过”.Where&lt;&gt;() 调用的包装类来将IQueryable&lt;Derived&gt; 转换为IQueryable&lt;Base&gt;

我的用例是我正在尝试处理具有许多相似表的数据库模式。大部分字段是通用的,很多通用字段需要在每张表上查询。我正在使用 LinqToSql。我希望避免重复每个表的所有查询。

【问题讨论】:

    标签: c# .net linq-to-sql iqueryable covariance


    【解决方案1】:

    以下是您要查找的内容吗?

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

    OfType 方法将收集任何属于指定类型的内容,如果集合中的所有项都是 Base 类型,或者派生自类型 base,则它们应该符合条件。在随后的 where 中,所有项目都是 Base 类型。

    【讨论】:

    • 哇。现在我觉得很笨。嗯,这看起来正是我需要的。谢谢。
    • 没问题。 :) 很高兴我能帮上忙。
    【解决方案2】:

    以下内容也可以使用,尽管它不那么漂亮:

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

    【讨论】:

    • 应该注意,如果派生实际上不是 Base 类型,这将失败。如果集合包含不一定从公共基础派生的各种对象,OfType 将安全地跳过那些未通过强制转换的对象,然后继续。
    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多