Oracle实体框架-调用自定义函数(EDIT_DISTANCE)

本文关键字:EDIT DISTANCE 自定义函数 实体 框架 调用 Oracle | 更新日期: 2023-09-27 18:10:18

我使用实体框架6和Oracle数据库11g (ODP)。. NET管理驱动程序).

如何在LINQ查询中调用UTL_MATCH.EDIT_DISTANCE函数?

Oracle实体框架-调用自定义函数(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对话框使用。按照约定,它成为导入的实体函数的返回值。您可能需要创建一个包装器存储过程来进行设置。