Где EF Core 2.2 может предотвращать трансляцию метода в SQL?
Я хочу сделать специфичную функцию, которая должна транслироваться в запрос. Специфичная, потому что принимает на вход 2 сущности (целиком).
Задача: по некоторым настройкам из конфига определить имеется ли между сущностями связь. Конфиги включают в себя сравнение некоторых свойств.
Этот функционал выполняется в нескольких частях системы и вот сейчас условие меняется, поэтому я хочу предотвратить дублирование выражений и вынести это наружу.
Что я для этого делаю:
- Создал функцию
bool MyClass.MyFunc(EntityType1 entity1, EntityType2 entity2) - Создал и зарегистрировал транслятор (реализовал
IMethodCallTranslator). Пока еще не реализовал в полной мере, но проблема возникает где-то до него.
При добавлении данного предиката в запрос
Where(x => MyClass.MyFunc(exprForFindEntity1, x))
и его выполнении я получаю исключение
The LINQ expression 'where MyFunc(exprForFindEntity1, [x])' could not be translated and will be evaluated locally.
Где-то на просторах интернета я нашел похожую, казалось бы (но я ошибался) проблему. Я реализовал интерфейс IEvaluatableExpressionFilter, но это немного не мой случай. Реализация его метода IsEvaluatableMethodCall работает только для функций, у которых нет параметров или все параметры константы. Такие функции EF пытается выполнить локально и его можно понять. Так вот данный метод может сказать ему этого не делать.
То есть при выполнении запроса с моей функцией в IEvaluatableExpressionFilter выполнение тоже не заходит.
Вопрос, каким образом EF понимает, что он не может транслировать запрос и пытается выполнить его локально? Он ведь даже не попытался это сделать, мой MethodCallTranslator наготове.
UPD: Фактически, мне и полноценный транслятор то не нужен, мне нужен визитор, который превратит MethodCallExpression в выражение с набором условий, которое Ef уже легко сможет транслировать. Но вот я не знаю способа натравить такой визитор на это выражение.