2012-10-02 36 views
5

Có một LINQ đơn giản để EF:Tại sao EF tạo truy vấn phụ cho truy vấn nhỏ?

var query = from p in _db.Posts 
      where p.BlogtId == blogId 
      select p; 

Nó tạo ra SQL theo hình thức này:

SELECT 
`Extent1`.`PostId`, 
`Extent1`.`BlogId`, 
... 
FROM `Posts` AS `Extent1` 
WHERE `Extent1`.`BlogId` = @p__linq__0 

Nhưng khi tôi thêm một trật tự bằng cách để truy vấn này

var query = from p in _db.Posts 
      where p.BlogId == blogId 
      orderby p.PublishDate 
      select p; 

Nó tạo truy vấn này

SELECT 
`Project1`.`PostId`, 
`Project1`.`BlogId`, 
... 
FROM (SELECT 
`Extent1`.`PostId`, 
`Extent1`.`BlogId`, 
... 
FROM `Posts` AS `Extent1` 
WHERE `Extent1`.`BlogId` = @p__linq__0) AS `Project1` 
ORDER BY 
`Project1`.`PublishDate` ASC 

Tại sao điều này tạo ra một truy vấn phụ? Có một vấn đề hiệu suất cho truy vấn này trong MySQL. MySQL đang cố gắng thực hiện truy vấn bên trong để kéo tất cả các bản ghi trong cơ sở dữ liệu và sau đó cố gắng sắp xếp chủ đề.

Tôi cần một giải pháp để tạo ra bên dưới sql bởi LINQ

SELECT 
`Extent1`.`PostId`, 
... 
FROM `Posts` AS `Extent1` 
WHERE `Extent1`.`BlogId` = @p__linq__0 
ORDER BY 
`Extent1`.`PublishDate` ASC 
+0

khác biệt gì nó làm cho bạn? – podiluska

+0

@podiluska Có một vấn đề về hiệu suất cho truy vấn này trong MySQL. MySQL đang cố gắng thực hiện truy vấn bên trong để kéo tất cả các bản ghi trong cơ sở dữ liệu và sau đó cố gắng sắp xếp chủ đề. –

+5

Tại sao nó sẽ kéo tất cả trở lại - chúng được lọc? – podiluska

Trả lời

5

Đây không phải là một vấn đề thực thể khuôn khổ, bất chấp những gì liên kết của bạn có thể nói cho người khác. Nó liên quan đến MySqlConnector/net. Tôi có thể chứng minh điều đó! Ah, không ngờ điều đó.

Móc chính xác kịch bản này lên bằng cách sử dụng cơ sở dữ liệu MSSQL, với đầu nối System.Data và bạn sẽ thấy SQL được định dạng đúng. Đây là một vấn đề với dự đoán bên trong của MySqlConnector. Nếu bạn muốn sửa chữa nó, sau đó đi vào và chỉnh sửa nó cho mình.

Dưới đây là làm thế nào để có một bản sao cục bộ thay đổi nội dung của MySqlConnector/net: How to customize MySql Connector/net?

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