Приведение лямбда-выражения к производному типу

Мне нужно немного волшебства. Я считаю, что то, что я пытаюсь сделать, имеет смысл, но если я не видел проблемы с планом, причины, по которым это было бы, также приветствуются.

У меня есть выражение

Expression<Func<Entity, bool>>

и я хочу преобразовать / преобразовать или даже создать совершенно новое выражение:

Expression<Func<Derived, bool>>

Он используется как запрос фильтра EF, передаваемый в качестве аргумента методу репозитория. Репозиторий возвращает перечислимое количество Entity, поэтому я мог бы достаточно легко использовать ковариацию, но я хочу выполнить некоторую пост-обработку запроса в его производном состоянии, прежде чем возвращать его.

Мне кажется, что EF должен делать это сам внутри, но я хотел бы иметь возможность запускать свой запрос, чтобы тип результата был производным типом, а не сущностью.

Спасибо за помощь.


person MJM    schedule 05.04.2013    source источник
comment
Что, если вы добавите Cast ‹Derived› к вашему запросу?   -  person Wouter de Kort♦    schedule 05.04.2013
comment
Я не уверен, что это дубликат, но он определенно очень похож на этот вопрос.   -  person Jon    schedule 05.04.2013
comment
Черт возьми. Я был толстым. Спасибо, что указали на очевидное кровотечение.   -  person MJM    schedule 05.04.2013


Ответы (2)


Если у вас есть выражение Expression<Func<Entity, bool>>, вы можете добавить к нему Cast<Derived>, чтобы отфильтровать все сущности этого конкретного типа.

person Wouter de Kort♦    schedule 05.04.2013

Работая на уровне Expression, вы можете построить новое выражение с типом Derived в качестве параметра:

var entityExpr = (Expression<Func<Entity, bool>>)(e => e.Str == "");
var derivedExpr = Expression.Lambda<Func<Derived, bool>>(entityExpr.Body, entityExpr.Parameters);
person polkduran    schedule 05.02.2016