Мне нужно прокачать 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. Но где его взять я тоже не знаю.
Вероятно, я слишком сложно и абстрактно объяснил суть проблемы. Так что отвечу на наводящие вопросы.