ODAC 11.2 第 4 版 (11.2.0.3.0) 引发"Oracle 11.2.0.2.0 does not support APPLY"异常



我正在将实体框架与oracle刚刚发布的新ODAC一起使用。

我的问题是,我在以前的测试版中运行的一些查询在这个新版本中停止了运行。

这里有一个例子:

IQueryable<SYS_PERFIL> query1 = m.DBContext.SYS_PERFIL.Where(T => T.SYS_UTILIZADOR.Where(TT => TT.ACTIVO == 1).Count() > 0);
IQueryable<SYS_PERFIL> query2 = m.DBContext.SYS_PERFIL.Where(T => T.SYS_UTILIZADOR.FirstOrDefault(TT => TT.ACTIVO == 1) != null);
string test1Query = ((System.Data.Objects.ObjectQuery)query1).ToTraceString();
string test2Query = ((System.Data.Objects.ObjectQuery)query2).ToTraceString();
var test1 = query1.ToList();
var test2 = query2.ToList();

当test1返回当前结果时,test2抛出oracle异常"ORA-00905:missing keyword",并显示消息:"oracle 11.2.0.2.0不支持APPLY"。

我不想重新测试我的所有方法。有没有办法告诉EF不要使用apply?

以下是EF正在生成的查询:

test1Query:

SELECT "Project1"."PERFIL_ID" AS "PERFIL_ID" FROM ( SELECT "Extent1"."PERFIL_ID" AS PERFIL_ID", (SELECT COUNT(1) AS "A1" FROM "SMI2012"."SYS_UTILIZADOR" "Extent2" WHERE (("Extent1"."PERFIL_ID" = "Extent2"."PERFIL_ID") AND (1 = "Extent2"."ACTIVO"))) AS "C1"
 FROM "SMI2012"."SYS_PERFIL" "Extent1")  "Project1" WHERE ("Project1"."C1" > 0)

test2Query:

SELECT "Extent1"."PERFIL_ID" AS "PERFIL_ID" FROM  "SMI2012"."SYS_PERFIL" "Extent1" CROSS APPLY  (SELECT "Extent2"."PERFIL_ID" AS "PERFIL_ID", "Extent2"."ACTIVO" AS "ACTIVO", "Extent2"."USER_ID" AS "USER_ID" FROM "SMI2012"."SYS_UTILIZADOR" "Extent2" WHERE (("Extent1"."PERFIL_ID" = "Extent2"."PERFIL_ID") AND (1 = "Extent2"."ACTIVO")) AND (ROWNUM <= (1) ) ) "Element1" WHERE ("Element1"."USER_ID" IS NOT NULL)

提前谢谢。

Telerik OpenAccess ORM不使用APPLY语句。我在嵌套组查询中遇到了同样的问题。当我构建OA模型时,查询运行得很好!

您尝试过Oracle 12c吗?

在这里https://forums.oracle.com/message/10168766#10168766

阅读应该有效。

这只适用于12c。在11g中,您必须重新编写查询。

IQueryable<SYS_PERFIL> query2 = from one in m.DBContext.SYS_PERFIL
  join two in m.DBContext.SYS_UTILIZADOR on one.COL1 equals two.COL1
  where two.ACTIVO == 1
  select one;

如果您有多个活动的SYS_UTILIZADOR,这将生成重复项。在这种情况下,你需要对其进行明确的抨击。这不会在大量行上产生超高的性能。少量应该可以。

最新更新