Что требуется для IMethodCallTranslator EF Core для работы с `EF.Functions` для обеспечения пользовательской функции? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь реализовать пользовательский IMethodCallTranslator в EF Core 3.1 с провайдером Sqlite.

Я создал:

  1. Метод расширения из this DbFunctions , который вызывается во время запроса
  2. Реализация IMethodCallTranslator , которая Translate не называется
  3. Производная RelationalMethodCallTranslatorProvider, которую я Передаю экземпляр моего IMethodCallTranslator. Этот конструктор является хитом. Я также попытался переопределить RelationalMethodCallTranslatorProvider.Translate, но это не было выполнено.
  4. Реализация IDbContextOptionsExtension (и его информационный класс), который регистрирует RelationalMethodCallTranslatorProvider как одиночный IMethodCallTranslatorProvider.

Все это добавляется через OnConfiguring, получая форму параметров IDbContextOptionsBuilderInfrastructure.

Я что-то упустил? Я попробовал следующее: https://github.com/tkhadimullin/ef-core-custom-functions/tree/feature/ef-3.1-version в моем коде, но он вызывает метод расширения, а не мой переводчик.

1 Ответ

0 голосов
/ 06 апреля 2020

Очевидно, что вы не можете передать ссылку на ваш полный класс сущности в функцию для дальнейшей обработки:

Не работает:

public static string DoWork(this DbFunctions _, object entity, string key)
//...
dbContext.Items.Select(i => new { Entity = i, String = EF.Functions.DoWork(i, i.StringValue) });

Где это будет:

public static string DoWork(this DbFunctions _, string key)
//...
dbContext.Items.Select(i => new { Entity = i, String = EF.Functions.DoWork(i.StringValue) });

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

public static string DoWork<T>(this DbFunctions _, string key)
//...
dbContext.Items.Select(i => new { Entity = i, String = EF.Functions.DoWork<Item>(i.StringValue) });
...