Возможно преобразовать IQueryable<Derived> в IQueryable<Base>?
-
16-09-2019 - |
Вопрос
Я знаю о ковариации, и я знаю, что в общем случае это будет невозможно в C # до версии 4.0.
Однако меня интересует конкретный случай.Есть ли какой-то способ получить конвертацию IQueryable<Derived>
Для IQueryable<Base>
каким-то образом создав класс-оболочку, который на самом деле не выполняет запрос, но на самом деле может "проходить" через .Where<>()
позвонить?
Мой вариант использования заключается в том, что я пытаюсь иметь дело со схемой базы данных, которая содержит много похожих таблиц.Большинство полей являются общими, и многие из общих полей необходимо запрашивать в каждой таблице.Я использую LinqToSql.Я надеялся избежать дублирования всех запросов для каждой таблицы.
Решение
Является ли следующее тем, что вы ищете?
var results = queryable.OfType<Base>.Where(...);
Метод OfType соберет все, что относится к указанному типу, и если все элементы в коллекции либо относятся к типу Base, либо являются производными от типа base, они должны соответствовать требованиям.В последующем where все элементы будут иметь тип Base.
Другие советы
Следующее также будет работать, хотя оно и менее красиво:
var results = queryable.Select(derived => (Base)derived).Where(...);