Como mapear a função EntitySql para uma função com nome diferente na loja?
-
21-09-2019 - |
Pergunta
A questão é:Dado um back-end de banco de dados que entende LeftStr e RightStr:onde, em uma implementação personalizada do provedor ADO.NET, eu estabeleceria um mapeamento para as funções canônicas imutáveis do EDM Esquerda e Direita?
Então, estou trabalhando com o provedor SQLite ADO.NET e ele funciona, mais ou menos, até você encontrar algumas funções de string que estão presentes, mas com nomes diferentes.Entre as funções ausentes/mal mapeadas estão as funções canônicas de string Esquerda e Direita.
Na extensão SQLite as funções equivalentes são mapeadas para LeftStr e RightStr.
Fiquei aquém ao procurar informações.Na falta de documentação para este cenário, ou na minha falta de habilidade em encontrá-lo, rastreei a chamada até o método de fábrica que cria o comando com o SQL gerado e suspeito que o SemanticResolver seja minha melhor pista, mas tomei algumas facadas no escuro, falsificando a única costura exposta que posso encontrar, ProviderManifest.xml, mas não estou tendo alegria.
Solução
A resposta pressupõe que SampleEntityFrameworkProvider seja a implementação de referência.
Cada comando sql a ser executado em uma implementação de provedor é processado por SampleEntityFrameworkProvider.SampleProviderServices.CreateDbCommandDefinition.
Este método chama CreateCommand que, por sua vez, passa DbCommandTree para SampleEntityFrameworkProvider.SqlGenerator, que é do tipo DbExpressionVisitor.
O SqlGenerator inicializa dicionários estáticos para lidar com a tradução.
Encontrei o que procurava em SqlGenerator.InitializeCanonicalFunctionHandlers e apenas segui o padrão mostrado.
Basta adicionar um novo método manipulador ao dicionário digitado no nome da função EDM que você deseja manipular.
Nesse caso, o manipulador só precisava renomear a função antes de ela ser escrita.
Novamente há uma implementação padrão desta funcionalidade, HandleFunctionDefaultGivenName(DbFunctionExpression e, string storeFunctionName).