EF core 2.2 HasDbFunction生成坏的Oracle SQL。

问题描述 投票:0回答:1

有很多网页告诉你如何使用EF SQL provider中没有内置的DB函数(大部分问题都是围绕json_value)。

所以我试图使用的解决方案可以在一个MVC Core 2.2与EF项目中找到 "无处不在 "的Oracle。

Startup.cs:

services.AddDbContext<OracleContext>(options => options.UseOracle(Configuration.GetConnectionString("OracleConnection")));

OracleContext.cs。

modelBuilder.HasDbFunction(typeof(JsonExtensions).GetMethod(nameof(JsonExtensions.JsonValue)))
                        .HasName("JSON_VALUE")
                        .HasSchema("");

JsonExtensions.cs。

public static class JsonExtensions
{
    public static string JsonValue(string column, [NotParameterized] string path)
    {
        throw new NotSupportedException();
    }
}

然后使用

var result = context.MyTable.Where(t => JsonExtensions.JsonValue(t.Json, "$.Task") == "Work" ).ToArray();

给我一个oracle异常。生成的SQL如下。

SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE "JSON_VALUE"("t"."JSON", N'$.Task') = N'Work'

这有两个问题

首先是它会抛出 ORA-40449:"返回值的数据类型无效"

可以通过删除函数名周围的双引号来解决。

SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE JSON_VALUE("t"."JSON", N'$.Task') = N'Work'

然后它就会抛出 ORA-40442:"JSON路径表达式语法错误" JZN-00208。路径必须以美元符号($)开头。. 我可以通过从字面参数N'$.Task'中删除N来消除它。

SELECT "t"."MYRECORDID", "t"."JSON" FROM "SCHEMA"."MYTABLE" "t" WHERE JSON_VALUE("t"."JSON", '$.Task') = N'Work'

这样运行并产生了预期的结果。

那么如何告诉EF不要在函数名周围加入双引号,不要在json_value的第二个参数前面放N呢?

oracle entity-framework function core
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.