2012-01-17 14 views
8

Estoy utilizando Entity Framework con el nuevo ODAC que acaba de lanzar Oracle.ODAC 11.2 Release 4 (11.2.0.3.0) lanzando la excepción "Oracle 11.2.0.2.0 no admite APLICAR"

Mi problema es que algunas de mis consultas que funcionaban en versiones beta anteriores dejaron de funcionar en esta nueva versión.

He aquí un ejemplo:

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(); 

Mientras test1 devuelve el resultado currect, test2 se emite una excepción de Oracle ORA-00905: falta la palabra clave 'con el mensaje: 'Oracle 11.2.0.2.0 no soporta Aplicar' .

No quiero volver a probar todos mis métodos. ¿Hay alguna manera de decirle a EF que no use apply?

Éstos son las consultas que EF está generando:

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) 

Gracias de antemano.

+4

¿Has resuelto este problema? Estoy teniendo el mismo problema si trato de usar FirstOrDefault dentro de la proyección. –

+0

Suponiendo que realmente no le importa si obtiene el primer registro, puede usar .Min en lugar de .FirstOrDefault. –

Respuesta

0

El ORM de Telerik OpenAccess no utiliza la instrucción APPLY. Tuve el mismo problema en una consulta de grupo anidado. Cuando construí el modelo OA, ¡la consulta funcionó muy bien!

0

Esto solo funcionará en 12c. En 11g, debes volver a escribir la consulta.

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; 

Esto generará duplicados si tiene más de un SYS_UTILIZADOR activo. Tendría que disparar distinto sobre eso en ese caso. Esto no dará como resultado un gran rendimiento en una gran cantidad de filas. Debería estar bien en un número pequeño.

Cuestiones relacionadas