Oracle实体框架-调用自定义函数(EDIT_DISTANCE)
本文关键字:EDIT DISTANCE 自定义函数 实体 框架 调用 Oracle | 更新日期: 2023-09-27 18:10:18
我使用实体框架6和Oracle数据库11g (ODP)。. NET管理驱动程序).
如何在LINQ查询中调用UTL_MATCH.EDIT_DISTANCE
函数?
有一个很棒的库来帮助将数据库函数和存储过程映射到实体框架。
安装Nuget包
- Install-Package EntityFramework.Functions
为函数创建扩展方法:
public static class OracleFunctions
{
[Function(FunctionType.BuiltInFunction, "TO_NUMBER")]
public static int? ToNumber(this string value) => Function.CallNotSupported<int?>();
}
映射到你的EntityFramework Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions)));
}
调用新映射的" tonnumber ()"函数:
.FirstOrDefault(p => p.Id == "209706".ToNumber());
和你的叔叔。
不幸的是,对于驻留在不同模式中的Oracle函数,如UTL_MATCH.EDIT_DISTANCE
,它将不起作用。您应该能够设置模式,但似乎它目前不与Oracle或其他东西一起工作。但对于其他功能,如SOUNDEX
等,这应该工作良好。
你可以阅读EntityFramework的文档。函数
我同意Gerrie Pretorius的观点,如果你使用数据库优先模型,你必须像下面这样在edmx文件中添加一个函数
<Function Name="TO_NUMBER" Aggregate="false" BuiltIn="true" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" ReturnType="number">
<Parameter Name="valueStr" Type="varchar" Mode="In" />
</Function>
然后在OracleFunctions类中添加一个静态函数,如下所示
[EdmFunction("Model.Store", "TO_CHAR")]
public static int? ToNumber(this string value) {
throw new NotSupportedException("this function is not supported");
}
有两种方法可以实现这一点:调用ODP。净ADO。. NET类,或者使用实体设计器中的导入函数对话框。
1)下面是一些示例代码,展示了如何从EF代码中调用进程,而不需要将它们导入到模型中——本质上你是在提取oracleccommand对象。在网上做一些调查可以帮助你修改你真正想要调用的包过程:
var ctx = new TestContext();
var cmd = ctx.Database.Connection.CreateCommand() as OracleCommand;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SOMESTOREDPROC";
var p_rc1 = new OracleParameter("p_rc1", OracleDbType.RefCursor, ParameterDirection.Output);
var p_rc2 = new OracleParameter("p_rc2", OracleDbType.RefCursor, ParameterDirection.Output);
cmd.Parameters.Add(p_rc1);
cmd.Parameters.Add(p_rc2);
if (ctx.Database.Connection.State != ConnectionState.Open)
ctx.Database.Connection.Open();
var reader = cmd.ExecuteReader();
2)
查看Oracle Developer Tools for Visual Studio在线帮助中的实体框架章节。您可以使用"运行存储过程"对话框来执行此操作。它会自动将元数据添加到配置文件中。
https://apexapps.oracle.com/pls/apex/f?p=44785:24:103660957753593::: 24: P24_CONTENT_ID, P24_PROD_SECTION_GRP_ID P24_PREV_PAGE: 11004年,24
见函数导入部分。
注意:只有存储过程中的第一个REF CURSOR会被Import Function对话框使用。按照约定,它成为导入的实体函数的返回值。您可能需要创建一个包装器存储过程来进行设置。