5

有一个简单的 Linq to 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

但是当我向这个查询添加 order by

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
4

1 回答 1

5

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

使用 MSSQL 数据库和连接器将这个确切的场景System.Data连接起来,您将看到格式正确的 SQL。这是 MySqlConnector 内部的投影问题。如果你想修复它,然后进入并自己编辑它。

以下是如何拥有 MySqlConnector/net 的本地编辑副本:如何自定义 MySql Connector/net?

于 2012-10-19T18:02:57.687 回答