为什么EF为简单查询生成子查询?

时间:2012-10-02 13:02:22

标签: mysql linq entity-framework

简单的Linq到EF:

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

它以这种形式生成SQL:

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

但是当我通过此查询添加订单时

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

它会生成此查询

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

为什么会生成子查询?MySQL中的此查询存在性能问题。 MySQL正在尝试执行内部查询,该查询将数据库中的所有记录拉回来,然后尝试对主题进行排序。

我需要一个通过linq生成以下sql的解决方案

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

1 个答案:

答案 0 :(得分:5)

这不是实体框架问题,尽管您的链接可能告诉其他人。它与MySqlConnector / net有关。我可以证明这一点!啊,没想到那个。呵呵。

使用带有System.Data连接器的MSSQL数据库将此确切方案挂起,您将看到正确形成的SQL。这是MySqlConnector内部的投影问题。如果您想修复它,请自行进行编辑。

以下是如何拥有本地编辑的MySqlConnector / net副本:How to customize MySql Connector/net?