views:

192

answers:

2

I know about covariance, and I know that in general it will not be possible in C# until v4.0.

However I am wondering about a specific case. Is there some way of getting converting IQueryable<Derived> to IQueryable<Base> by somehow creating a wrapper class that does not actually perform a query, but can actually "pass through" a .Where<>() call?

My use case is that I am trying to deal with a database schema that has many similar tables. Most of the fields are in common, and many of the common fields need to be queried on each table. I'm using LinqToSql. I was hoping to avoid duplicating all the queries for each table.

+4  A: 

Is the following what you are looking for?

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

The OfType method will gather up anything that is of the specified type, and if all items in the collection are either of type Base, or derived from type base, they should qualify. In the subsequent where, all items would be of type Base.

jrista
Wow. Now I feel dumb. Well, that looks like exactly what I needed. Thanks.
recursive
No problem. :) Glad I could help.
jrista
A: 

The following will also work, altough it is less pretty:

var results = queryable.Select(derived => (Base)derived).Where(...);
Konamiman
It should be noted that this will fail if derived is not actually of type Base. If the collection contains a variety of objects that do not necessarily derive from a common base, OfType<T> will safely skip past those that fail the cast, and continue on.
jrista