2010-01-17 86 views
2

问题是:给定一个理解LeftStr和RightStr的数据库后端:其中,在自定义ADO.NET提供程序实现中,是否会建立映射到不可变EDM规范函数Left和Right?如何将EntitySql函数映射到商店中不同名称的函数?


所以我与SQLite的ADO.NET提供工作和它的作品,或多或少,直到你碰到了对一些字符串函数是存在的,但不同的名称。遗漏/错误映射的函数是规范的字符串函数Left和Right。

在SQLite扩展中,等效函数被映射到LeftStr和RightStr。

我在找资料的时候已经不多了。由于缺乏这种情况下的文档,或者我没有找到它的能力,我一步步地将调用追踪到工厂方法中,该方法使用生成的SQL创建命令,并且怀疑SemanticResolver是我最好的线索,但是我已经采取了在我能找到的唯一露出的接缝处冒出黑暗中的一些刺,ProviderManifest.xml,但我没有喜悦。

+0

我目前看@ ExpressionCopier – 2010-01-17 10:08:14

+0

现在看@DbExpressionVisitor – 2010-01-17 10:20:00

回答

1

答案假定SampleEntityFrameworkProvider是参考实现。

要针对提供者实现执行的每个sql命令都由SampleEntityFrameworkProvider.SampleProviderServices.CreateDbCommandDefinition处理。

该方法调用CreateCommand,该方法依次将DbCommandTree传递给SampleEntityFrameworkProvider.SqlGenerator,该类型的DbExpressionVisitor类型。

SqlGenerator初始化静态字典以处理翻译。

我找到了我在SqlGenerator.InitializeCanonicalFunctionHandlers中查找的内容,并按照所示的模式进行操作。

只需添加一个新的处理程序方法到您想要处理的EDM函数名称的字典上。

在这种情况下,处理程序只需在函数写出之前重命名该函数。

此函数的默认实现是HandleFunctionDefaultGivenName(DbFunctionExpression e,string storeFunctionName)。