EF への単純な Linq があります。
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 は、データベース内のすべてのレコードを取得し、テーマを並べ替えようとする内部クエリを実行しようとしています。
以下のSQLをlinqで生成するソリューションが必要です
SELECT
`Extent1`.`PostId`,
...
FROM `Posts` AS `Extent1`
WHERE `Extent1`.`BlogId` = @p__linq__0
ORDER BY
`Extent1`.`PublishDate` ASC