2012-01-17 29 views
8

Tôi đang sử dụng Khung thực thể với ODAC mới mà oracle vừa được phát hành.ODAC 11.2 Phiên bản 4 (11.2.0.3.0) ném "Oracle 11.2.0.2.0 không hỗ trợ ÁP DỤNG" ngoại lệ

Vấn đề của tôi là một số truy vấn của tôi đang hoạt động trong các bản phát hành beta trước đó đã ngừng hoạt động trong phiên bản phát hành mới này.

Dưới đây là một ví dụ:

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

Trong khi test1 trả về kết quả currect, test2 ném một ngoại lệ oracle 'ORA-00.905: thiếu từ khoá' với thông điệp: 'Oracle 11.2.0.2.0 không hỗ trợ ÁP DỤNG' .

Tôi không muốn kiểm tra lại tất cả các phương pháp của mình. Có cách nào để nói với EF không sử dụng được không?

Dưới đây là các truy vấn mà EF được tạo ra:

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) 

Cảm ơn trước.

+4

bạn đã giải quyết được sự cố này chưa? Tôi đang gặp vấn đề tương tự nếu tôi cố gắng sử dụng FirstOrDefault bên trong chiếu. –

+0

Giả sử bạn không thực sự quan tâm nếu bạn nhận được bản ghi đầu tiên, bạn có thể sử dụng. Thay vì .irstOrDefault. –

Trả lời

0

ORM OpenAccess Telerik không sử dụng câu lệnh APPLY. Tôi đã có cùng một vấn đề trên một truy vấn nhóm lồng nhau. Khi tôi xây dựng mô hình OA, truy vấn chạy rất tốt!

0

Điều này sẽ chỉ hoạt động ở 12c. Trong 11g bạn phải viết lại truy vấn.

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; 

Điều này sẽ tạo bản sao nếu bạn có nhiều hơn một SYS_UTILIZADOR hoạt động. Bạn sẽ cần phải phân biệt về điều đó trong trường hợp đó. Điều này sẽ không dẫn đến hiệu suất siêu lớn trên số lượng lớn hàng. Nên được OK trên một số lượng nhỏ.

Các vấn đề liên quan