Entity Framework 核心 - Take(1)、Single()、First()... 不与 Oracle 提供程序一起工作(ORA-00933:SQL 命令未正确结束)
Entity Framework Core - Take(1), Single(), First()... Not Working with Oracle Provider (ORA-00933: SQL command not properly ended)
我正在使用 ef core(2.2.4) 和 oracle 数据库
oracle 提供者: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
不是
FETCH FIRST 1 ROWS ONLY
和 .ToList() 与 IQueryable
一起工作正常
显然您的目标是旧的 Oracle 数据库,它不支持较新的 FETCH FIRST N ROWS ONLY
SQL 构造。
为了获得基于 ROWNUM
的旧 SQL 翻译,您应该使用 UseOracle
方法和 UseOracleSQLCompatibility
扩展方法的可选 Action<OracleDbContextOptionsBuilder> oracleOptionsAction
参数值为“11”(目前唯一支持的值为“11”和“12”):
.UseOracle(connection_string, options => options
.UseOracleSQLCompatibility("11"))
我正在使用 ef core(2.2.4) 和 oracle 数据库
oracle 提供者: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
不是
FETCH FIRST 1 ROWS ONLY
和 .ToList() 与 IQueryable
一起工作正常显然您的目标是旧的 Oracle 数据库,它不支持较新的 FETCH FIRST N ROWS ONLY
SQL 构造。
为了获得基于 ROWNUM
的旧 SQL 翻译,您应该使用 UseOracle
方法和 UseOracleSQLCompatibility
扩展方法的可选 Action<OracleDbContextOptionsBuilder> oracleOptionsAction
参数值为“11”(目前唯一支持的值为“11”和“12”):
.UseOracle(connection_string, options => options
.UseOracleSQLCompatibility("11"))