在构建Linq-to-Sql代码时(模型优先),强制实体框架不生成NCLOB

mju*_*516 6 c# linq oracle entity-framework linq-to-sql

我有一个具有可为null的int属性的类,出于过滤原因,我需要将其转换为字符串以进行一些比较。我已经安装了EF 6.1.2,因此使用.ToString()可以解决该问题。

queryableData = queryableData.Where(a => 
    a.PropName.HasValue && a.PropName.Value.ToString().Contains("8675309"));
Run Code Online (Sandbox Code Playgroud)

当检查正在执行的实际SQL时,该数字正被CAST转换为NCLOB类型,从而导致以下错误:

ORA-00932:数据类型不一致:预期的NCHAR-获得了NCLOB

根据我的阅读,这是因为在这种情况下,实体不知道潜在的最大大小,因此它默认为最大选项。我知道,使用字符串属性,我可以表示最大大小来提供帮助。在将该属性保留为int值以防止使用NCLOB的同时,我能做些什么?还是在防止此异常的同时使用它们的方法?

其他注意事项:

  • 我在Oracle系统上,因此SqlFunctions.StringConvert退出了。
  • 我使用的是Odp.net 12.x版(与此帖子相关)。
  • EF是一种“模型优先”的方法。
  • .Where()子句被添加到AsQueryable()中,因此我无法在内存中执行任何操作。

nik*_*ost 3

我对Oracle( Oracle 11.2.02和Oracle.ManagedDataAccess.12.2.1100)和实体框架(EntityFramework.6.1.3 )也有同样的问题。

这里面的 Linq 代码(属性“Id”是整数):

Material.Id.ToString()

生成此 SQL:

(CASE WHEN ("Extent3"."Material_Id" IS NULL) THEN N'' ELSE TO_NCLOB("Extent3"."Material_Id") END)

问题是TO_NCLOB,应该是TO_NCHAR

解决方案
JonathanPeel 注释
Install-Package EntityFramework.Functions