ODAC 11.2 Release 4 (11.2.0.3.0), выбрасывающий исключение «Oracle 11.2.0.2.0 не поддерживает APPLY» - PullRequest
8 голосов
/ 17 января 2012

Я использую Entity Framework с новым ODAC, который только что выпустил Oracle.

Моя проблема в том, что некоторые из моих запросов, которые работали в предыдущих бета-версиях, перестали работать в этой новой версии.

Вот пример:

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 генерирует исключение оракула «ORA-00905: отсутствует ключевое слово» с сообщением: «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)

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 31 июля 2013

Вы пробовали Oracle 12c?

Здесь https://forums.oracle.com/message/10168766#10168766

прочитайте, что должно работать.

0 голосов
/ 15 февраля 2016

Это будет работать только в 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.В этом случае вам нужно четко об этом говорить.Это не приведет к супер отличной производительности на большом количестве строк.Должно быть в порядке на небольшом количестве.

0 голосов
/ 11 апреля 2013

Telerik OpenAccess ORM не использует инструкцию APPLY. У меня была та же проблема с запросом вложенной группы. Когда я строил модель ОА, запрос выполнялся отлично!

...