Mögliche IQueryable zu IQueryable konvertieren?
-
16-09-2019 - |
Frage
Ich weiß, über Kovarianz, und ich weiß, dass es im Allgemeinen in C # nicht möglich sein, bis v4.0.
Allerdings frage ich mich, über einen bestimmten Fall. Gibt es eine Möglichkeit des Erhaltens IQueryable<Derived>
Umwandlung von irgendwie Erstellen einer Wrapper-Klasse IQueryable<Base>
, der nicht wirklich eine Abfrage durchführen, kann aber tatsächlich „passieren“ ein .Where<>()
Anruf?
Ihr Anwendungsfall ist, dass ich mit einem Datenbankschema umgehen versuchen, die viele ähnlichen Tabellen hat. Die meisten Felder sind gemeinsam, und viele der gemeinsamen Felder müssen auf jeder Tabelle abgefragt werden. Ich verwende LinqToSql. Ich hatte gehofft, alle Abfragen für jede Tabelle zu vermeiden, zu duplizieren.
Lösung
Ist der folgenden, was Sie suchen?
var results = queryable.OfType<Base>.Where(...);
Die OfType Methode wird bis alles sammeln, die von dem angegebenen Typ ist, und wenn alle Elemente in der Sammlung entweder vom Typ Basis sind, oder von Typ-Basis abgeleitet, sollten sie sich qualifizieren. In der anschließenden, wo alle Elemente des Typs Basis sein würde.
Andere Tipps
Im Folgenden wird auch funktionieren, obwohl es weniger schön ist:
var results = queryable.Select(derived => (Base)derived).Where(...);