2009-09-24 98 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

相关问题