有很多网页告诉你如何使用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呢?