2012-01-17 58 views
8

我正在使用实体框架与Oracle刚刚发布的新ODAC。ODAC 11.2版本4(11.2.0.3.0)抛出“Oracle 11.2.0.2.0不支持APPLY”异常

我的问题是,我在以前的测试版中工作的一些查询在此新版本版本中停止工作。

下面是一个例子:

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:缺少关键字' 与消息: '甲骨文11.2.0.2.0不支持应用' 。

我不想重新测试我所有的方法。有没有办法告诉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) 

预先感谢。

+4

你解决了这个问题吗?如果我尝试在投影中使用FirstOrDefault,我遇到同样的问题。 – 2012-09-07 14:40:35

+0

假设您并不在乎是否获得第一条记录,则可以使用.Min而不是.FirstOrDefault。 – 2015-12-10 15:43:01

回答

0

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

0

这只会在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,这将生成重复项。在这种情况下,你需要着手解决。这不会在大量的行上产生超强的性能。应该在一小部分上确定。

相关问题