我正在用oracle数据库测试EntityFramework6.2,但是在尝试在多个条件下进行转换时会遇到问题。
我需要将TABLE2_ID (NUMBER)与TABLE2.ID (VARCHAR2)匹配,后者是不同的值类型。问题是,ToString()方法将转换为TO_NCLOB,而不是工作的TO_NCHAR。
var query = from table1 in context.TABLE1
join table2 in context.TABLE2 on table1.TABLE2_ID.ToString() equals table2.ID
select new
{
table1.NAME,
table2.TEXT
};生成的SQL如下所示:
SELECT
1 AS "C1",
"Extent1"."NAME" AS "NAME",
"Extent2"."TEXT" AS "TEXT"
FROM "USER"."TABLE1" "Extent1"
INNER JOIN "USER"."TABLE2" "Extent2" ON
(CASE WHEN ("Extent1"."TABLE2_ID" IS NULL) THEN N''
// At this point I need TO_NCHAR
ELSE TO_NCLOB("Extent1"."TABLE2_ID") END) = "Extent2"."ID"这导致:
ORA-00932:不一致的数据类型:预期NCHAR获得NCLOB
我知道有许多问题有几乎相同的例外,但只有不同的用例,所以请看我如何解决这个问题。
例如,是否有一种方法可以覆盖ToString() SQL转换?
主要问题: LINQ .ToString()转换为TO_NCLOB,但我需要TO_NCHAR或其他解决方案。
我将Visual 2017与Oracle开发工具一起用于VS2017 12.2.0.11
发布于 2018-07-05 07:06:47
遗憾的是,.ToString()在中没有很好地实现。所以我找到了这个SO question accepted answer的解决办法。安装EntityFramework.Functions Nuget包并使用内置于TO_NCHAR函数的TO_NCHAR完成了以下工作:
public static class OracleFunctions
{
[Function(FunctionType.BuiltInFunction, "TO_NCHAR")]
public static string ToNChar(this string value) => Function.CallNotSupported<string>();
}用OnModelCreating重写DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions)));
}然后我就可以像这样使用它,它工作得完美无缺:
var query = from table1 in context.TABLE1
join table2 in context.TABLE2 on table1.TABLE2_ID.ToNChar() equals table2.ID
select new
{
table1.NAME,
table2.TEXT
};https://stackoverflow.com/questions/51017685
复制相似问题