2013-05-11 33 views
7

Tôi muốn tạo một số trường hợp thử nghiệm cho truy vấn khung thực thể chắc chắn tạo ra các lệnh SQL có chứa các toán tử CROSS APPLY hoặc OUTER APPLY.Entity Framework và CROSS/OUTER ÁP DỤNG

Ai đó có thể hiển thị các trường hợp điển hình trong đó các loại truy vấn SQL này xuất hiện?

Trả lời

9

Trong LINQ 2 SQL này luôn dẫn đến một APPLY:

from t1 in tab1 
from t2 in tab2.Where(t2 => t2.SomeCol == t1.SomeCol).Take(1) 
select new { t1, t2 } 

Trong EF này hoặc sẽ thất bại, hoặc cũng dẫn đến một APPLY (Tôi không biết cái nào). Đây là số liên lạc tương quan yêu cầu số APPLY ở phía SQL.

+3

Cảm ơn bạn! Điều này mang lại cho tôi một truy vấn CROSS APPLY. Ngoài ra nếu tôi sử dụng Take (2) .DefaultIfEmpty() thì một truy vấn OUTER APPLY được tạo ra. – tamasf

3

Something như thế này sẽ tạo ra một bên ngoài được áp dụng:

var ListLocation = from d in dc.Department        
         select new DepartmentViewModel() 
         { 
          LocationID = d.LocationID, 
          ManagerName = d.Managers.FirstOrDefault(p => p.ManagerId == id).Name 

          }; 

Nếu nó không hoạt động bạn luôn có thể vượt qua truy vấn của riêng bạn nếu bạn đang sử dụng EF:

var q2 = context.Departments.SqlQuery("Select ..."); 

nhớ rằng mặc dù nhà cung cấp của bạn phải là SQL Server 2005 trở lên, EF không hỗ trợ OUTER APPLY cho Oracle