Possibile convertire IQueryable<Derived> per IQueryable<Base>?
-
16-09-2019 - |
Domanda
So che sulla covarianza, e so che, in generale, non sarà possibile in C# fino a v4.0.
Tuttavia mi chiedo su un caso specifico.C'è qualche modo di ottenere la conversione IQueryable<Derived>
per IQueryable<Base>
in qualche modo creando una classe wrapper che in realtà non eseguire una query, ma in realtà può "passare attraverso" un .Where<>()
chiamata?
Il mio caso d'uso è che sto cercando di fare con lo schema di un database che ha molte tabelle simili.La maggior parte dei campi sono in comune, e molti dei campi devono essere interrogato su ogni tavolo.Sto usando LinqToSql.Speravo di evitare la duplicazione di tutte le query per ogni tabella.
Soluzione
È il seguito di quello che stai cercando?
var results = queryable.OfType<Base>.Where(...);
L'oggetto oftype metodo di raccogliere tutto ciò che è del tipo specificato, e se tutti gli elementi della collezione sono di tipo Base, o deriva da un tipo di base, devono qualificarsi.Nella successiva dove, tutti elementi di Base di tipo.
Altri suggerimenti
Di seguito sarà anche funzionare, anche se è meno bella:
var results = queryable.Select(derived => (Base)derived).Where(...);