Как сопоставить функцию EntitySql с функцией с другим именем в магазине? - PullRequest
2 голосов
/ 17 января 2010

Вопрос заключается в следующем: с учетом серверной части базы данных, которая понимает LeftStr и RightStr: где в реализации собственного поставщика ADO.NET я бы установил сопоставление с неизменяемыми каноническими функциями EDM Left и Right?


Итак, я работаю с поставщиком SQLite ADO.NET, и он работает более или менее, пока вы не столкнетесь с некоторыми строковыми функциями, которые присутствуют, но названы по-разному. Среди отсутствующих / неправильно отображенных функций есть канонические строковые функции Left и Right.

В расширении SQLite эквивалентные функции сопоставлены с LeftStr и RightStr.

Мне не хватает информации при поиске. Из-за отсутствия документации для этого сценария или из-за отсутствия у меня возможности найти его, я пошагово проследил вызов до фабричного метода, который создает команду с сгенерированным SQL, и подозреваю, что SemanticResolver - мой лучший ключ, но я принял несколько ударов в темноте, обманывая единственный открытый шов, который я могу найти, ProviderManifest.xml, но не испытываю радости.

1 Ответ

1 голос
/ 17 января 2010

Ответ предполагает, что SampleEntityFrameworkProvider является эталонной реализацией.

Каждая команда sql, выполняемая для реализации поставщика, обрабатывается SampleEntityFrameworkProvider.SampleProviderServices.CreateDbCommandDefinition.

Этот метод вызывает CreateCommand, который, в свою очередь, передает DbCommandTree в SampleEntityFrameworkProvider.SqlGenerator, который имеет тип DbExpressionVisitor.

SqlGenerator инициализирует статические словари для обработки перевода.

Я нашел то, что искал в SqlGenerator.InitializeCanonicalFunctionHandlers, и просто следовал шаблону, как показано.

Просто добавьте новый метод-обработчик в словарь, в котором указано имя функции EDM, которую вы хотите обработать.

В этом случае обработчику просто нужно было переименовать функцию, прежде чем она была записана.

Снова существует реализация этой функции по умолчанию, HandleFunctionDefaultGivenName (DbFunctionExpression e, строка storeFunctionName).

...