@iRumba

Как получить значение ParameterExpression?

Мне нужно прокачать Ef Core (5). Есть некоторая функция в запросе, которая должна не транслироваться в БД функцию, а превратиться в в иную конструкцию (Expression).
Для этого я перехватил обход всего выражения через подмену сервисов EF.
Проблема в том, что функция принимает некий объект в качестве параметра и в моем визиторе я получаю MethodCallExpression с параметром ParameterExpression, который содержит имя параметра и тип. А для построения правильного выражения, мне нужно значение этого параметра.

Вот примерный код запроса
var myObject = new SomeObject();

ctx.MyEntity
    .Where(x => x.MyFunction(myObject))
    .ToList();


и вот этот самый myObject мне и нужен в моем визиторе. Если бы визитор я подключил прямо в функции запроса, я бы мог передать в него дополнительный параметр со значением объекта. Но тогда пришлось бы цеплять визитор к каждому запросу, а это неудобно, некрасиво и вообще атата.

Поэтому я в регистрации сервисов EF заменил QueryTranslationPreprocessor на свой.

Конструктор этого сервиса принимает в качестве параметров QueryTranslationPreprocessorDependencies и QueryCompilationContext.
Я пытался отыскать какую то возможность получить мой объект через эти объекты, но не нашел. Либо я плохо искал, либо через них нельзя.
Так же, первым выражением в переопределенный метод QueryTranslationPreprocessor.Process(Expression) приходит QueryRootExpression. в нем тоже пытался найти какое то ссылки на мой объект.

Так же, я сумел через IEvaluatableExpressionFilterPlugin запретить транслировать объекты типа SomeObject. После этого в мой визитор этот объект стал приходить как MemberExpression. Это уже ближе (возможно), так как это теперь не просто параметр, а выражение, содержащее MemberInfo. И этот объект является полем класса (сформированного от функции, внутри которой создается запрос). То есть для получения Member.GetValue() мне нужно передать туда экземпляр объекта типа Member.DeclaringType. Но где его взять я тоже не знаю.

Вероятно, я слишком сложно и абстрактно объяснил суть проблемы. Так что отвечу на наводящие вопросы.
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
@KislyFan
инженер, связист и просто любитель выпить
Не понятно, к чему такие сложности? Почему заранее не собрать Expression и подкидывать его в фильтры по необходимости?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы