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.
¿Has resuelto este problema? Estoy teniendo el mismo problema si trato de usar FirstOrDefault dentro de la proyección. –
Suponiendo que realmente no le importa si obtiene el primer registro, puede usar .Min en lugar de .FirstOrDefault. –