Где 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 уже легко сможет транслировать. Но вот я не знаю способа натравить такой визитор на это выражение.


Ответы (0 шт):