简单的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
答案 0 :(得分:5)
这不是实体框架问题,尽管您的链接可能告诉其他人。它与MySqlConnector / net有关。我可以证明这一点!啊,没想到那个。呵呵。
使用带有System.Data
连接器的MSSQL数据库将此确切方案挂起,您将看到正确形成的SQL。这是MySqlConnector内部的投影问题。如果您想修复它,请自行进行编辑。
以下是如何拥有本地编辑的MySqlConnector / net副本:How to customize MySql Connector/net?