Take(1)在Oracle Provider的ef核心中不起作用

时间:2019-05-28 11:40:15

标签: c# oracle entity-framework entity-framework-core oracle-manageddataaccess

我正在将ef core(2.2.4)与oracle数据库一起使用

oracleProvider:Oracle.EntityFrameworkCore(2.18.0-beta3)

此代码:

IQueryable<KeyInfo> queryable = context
                .KeyInfos
                .Where(x => x.MobileNumber == "989191111111")
                .Take(1);

生成此数据库查询:

SELECT "x"."ID", "x"."Key", "x"."MobileNumber", "x"."NationalCode"
FROM "KeyInfo" "x"
WHERE "x"."MobileNumber" = N'989191111111'
FETCH FIRST 1 ROWS ONLY;

正在运行的查询给我这个错误:

ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:
Error at Line: 4 Column: 1

反正要修复吗?正确的方法是使用

获取第一行
  

AND rownum = 1

不是

  

仅获取第一行

和.ToList()与IQueryable配合使用

1 个答案:

答案 0 :(得分:3)

显然,您的目标是不支持较新的FETCH FIRST N ROWS ONLY SQL构造的Oracle数据库。

为了获得较旧的基于ROWNUM的SQL转换,您应该使用Action<OracleDbContextOptionsBuilder> oracleOptionsAction方法的可选UseOracle参数和UseOracleSQLCompatibility扩展方法,其值为“ 11”(当前仅支持的值为“ 11”和“ 12”):

.UseOracle(connection_string, options => options
    .UseOracleSQLCompatibility("11"))