"Selecting" or "Wrapping" an IQueryable so that it is still queryable
I have a Class / API that uses an IQueryable<FirstClass>
data source however I wish to expose an IQueryable<SecondClass>
, where SecondClass
is a wrapper class for FirstClass
that exposes nearly identical properties, however for various reasons needs to inherit from an unrelated base class. For example:
// My API
void IQueryable<SecondClass> GetCurrentRecords()
{
return from row in dataSource
/* Linq query */
select new SecondClass(row);
}
// User of my API
var results = GetCurrentRecords().Where(row => row.Owner = "Mike");
Now I can make the above compile simply by using AsQueryable
however I want to expose a "true" IQueryable
that efficiently queries the database based on the API users query.
I know that this isn't triv开发者_JS百科ial (my wrapper IQueryable implementation needs to understand the relationship between the properties of SecondClass
and FirstClass
), and that it has nothing to do with the Select
function, but it seems like it should be possible.
How do I do this?
Note: I know that instead my API could just expose FirstClass
along with a helper method to convert FirstClass
to SecondClass
for when the API user is "done" creating their query, but it feels messy and I don't like the idea of exposing my generated classes in this way. Also I'd like to know how to do the above anyway just from a purely academic standpoint.
Probably, you should return not an IQueriable, but Expression. Then you will be able to modify expression and let LINQ generate a query from a final Expression object. Example is here: http://msdn.microsoft.com/en-us/library/bb882637.aspx
精彩评论