Mysql 为什么EF为simle查询生成子查询?
有一个简单的Linq到EF:Mysql 为什么EF为simle查询生成子查询?,mysql,linq,entity-framework,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.BlogtId == blogId
select p;
它以以下形式生成SQL:
SELECT
`Extent1`.`PostId`,
`Extent1`.`BlogId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0
但是当我向这个查询添加orderby时
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
它生成这个查询
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正在尝试执行内部查询,该查询提取数据库中的所有记录,然后尝试对主题进行排序
我需要一个解决方案来生成下面的sql由linq
SELECT
`Extent1`.`PostId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0
ORDER BY
`Extent1`.`PublishDate` ASC
这不是实体框架问题,不管您的链接可能会告诉其他人什么。它与MySqlConnector/net相关。我可以证明!啊,没想到啊 使用MSSQL数据库和
System.Data
连接器将这个场景连接起来,您将看到格式正确的SQL。这是MySqlConnector内部的投影问题。如果你想修复它,那就自己动手编辑吧
下面是如何获得MySqlConnector/net的本地编辑副本:为什么它会将它们全部拉回来?它们已被过滤?我不认为这应该比您建议的查询慢多少。我承认EF的版本读起来很难。它非常明确地过滤子查询,然后对最终结果集进行排序。也许这就是LINQ确保RDBMS在过滤之前不会对所有结果进行排序的方法?你的索引设置正确吗?每个查询的一些性能指标如何?EF不生成SQL。它生成一个ADO.NET CCT。您的MySQL提供程序生成SQL。询问提供程序的作者,为什么它会生成MySQL不能很好处理的SQL。@CraigStuntz请阅读此线程问:还有一个问题,这个问题与MySQL数据提供程序有关,或者它来自EntityFramework/Linq to entities的核心?答:这与EF有关,如果可能的话,我建议您以后升级版本,最新版本会更有效。:)@GhootiFarangi:我重复一遍:EF不会生成SQL;您的MySQL提供程序可以。EF对MySQL的SQL语法一无所知。这来自提供者。我看到一个微软的人有点暗示了另一种情况,但这并不是真的。