2013-07-19 29 views
8

Tôi có một bảng gọi là PersonTable với các cột: PersonId, RestarauntId, AgeTại sao khung thực thể tạo truy vấn phụ khi chọn từ chế độ xem?

tôi có một cái nhìn gọi PersonView có quyền này:

select PersonId, 
     RestarauntId, 
     RestarauntName(RestarauntId) as `RestarauntName`, 
     Age 
FROM PersonTable 

Khi tôi làm một cái gì đó đơn giản như:

var persons = context.PersonView.Where(x=>x.PersonId == 1) 
           .Select(x=> 
            new {x.PersonId, 
             x.RestarauntId, 
             x.RestarauntName, 
             x.Age }); 

Trên đây trả về 1 bản ghi và tôi hy vọng truy vấn MySql sẽ là:

SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView 
WHERE PersonId = 1 

NHƯNG thay vào đó, nó tạo ra như sau:

SELECT 1 AS `C1`, T.PersonId, T.RestarauntId, T.RestarauntName, T.Age 
FROM 
(SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView) AS T 
WHERE T.PersonId = 1 

Vì vậy, nó không quan trọng những gì tôi vượt qua mệnh đề where, nó sẽ luôn luôn nhận được tất cả các hồ sơ đầu tiên trong một sub-chọn. Điều này chỉ xảy ra khi tôi truy vấn đối với chế độ xem mà tôi cần, nhưng tôi tò mò là tại sao nó tạo truy vấn ở trên thay vì truy vấn tôi mong đợi? Đây có phải là vấn đề về khung thực thể hoặc vấn đề MySql không?

+0

MySQL không có khả năng tối ưu hóa cả hai truy vấn cho cùng một gói? Có lẽ sự khác biệt không quan trọng trong thời gian chạy. – usr

+2

http://stackoverflow.com/questions/12690775/why-ef-generating-a-sub-query-for-a-simle-query –

+1

Tôi không biết điều đó có hữu ích hay không, nhưng EF sẽ không sử dụng thông tin chính trên các chế độ xem để xác định loại tham gia. Nó chỉ chọn sử dụng một tham gia bên trong trên các bảng, không bao giờ trên các khung nhìn. – Brannon

Trả lời

1

Chế độ xem MySql không cho phép bộ lọc động trong truy vấn được sử dụng.
Có vài hacks được sử dụng để đạt được điều này. Nhưng theo thiết kế, quan điểm mysql không phải là động trong tự nhiên. Chế độ xem luôn thực thi truy vấn thực tế được cung cấp và chỉ trên kết quả đó, việc lọc thêm có thể được thực hiện, như bạn đã đề cập trong ví dụ của mình. Để biết thêm chi tiết, hãy truy cập Here

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