Question

Je sais covariance, et je sais qu'en général il ne sera pas possible en C # jusqu'à v4.0.

Cependant, je me demande au sujet d'un cas particulier. Est-il possible de se convertir à IQueryable<Derived> IQueryable<Base> en créant en quelque sorte une classe wrapper qui ne fonctionne pas en fait une requête, mais peut en fait « passer à travers » un appel .Where<>()?

Mon cas d'utilisation est que je suis en train de traiter avec un schéma de base de données qui a de nombreuses tables similaires. La plupart des champs sont en commun, et la plupart des champs communs doivent être interrogés sur chaque table. J'utilise LinqToSql. J'espérais éviter de dupliquer toutes les requêtes pour chaque table.

Était-ce utile?

La solution

est le suivant ce que vous cherchez?

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

La méthode OfType va rassembler tout ce qui est du type spécifié, et si tous les éléments de la collection sont soit de type base ou dérivés de la base de type, ils doivent se qualifier. Dans le où après, tous les éléments seraient de type base.

Autres conseils

Ce qui suit travaillera également, même si elle est moins jolie:

var results = queryable.Select(derived => (Base)derived).Where(...);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top