2

我有一张存储 3k 条记录的表,

我是 Entity Framework 和 ORM 的新手,但我可以理解出现问题。

当我运行这个 linq 查询时:

repo.GetQuery<Article>().Where(foo=>foo.Expires_date>=date
                            && foo.Istoparticle==true
                            && foo.Isfrontpage==false)
                        .OrderByDescending(foo=>foo.Date)
                        .Take(4);

我在 mysql 端得到这个查询:

选择
`Project1`.`Id`,
`Project1`.`User_id`,
`Project1`.`Category_id`,
`Project1`.`标题`,
`Project1`.`值`,
`Project1`.`关键字`,
`Project1`.`描述`,
`Project1`.`图片`,
`Project1`.`投票`,
`Project1`.`Views`,
`Project1`.`Isvisible`,
`Project1`.`Isfrontpage`,
`Project1`.`Istoparticle`,
`Project1`.`日期`,
`Project1`.`Expires_date`,
`Project1`.`Votes_sum`
从(选择
`Extent1`.`Id`,
`Extent1`.`User_id`,
`Extent1`.`Category_id`,
`Extent1`.`标题`,
`Extent1`.`值`,
`Extent1`.`关键字`,
`Extent1`.`描述`,
`Extent1`.`图片`,
`Extent1`.`投票`,
`Extent1`.`Votes_sum`,
`Extent1`.`Views`,
`Extent1`.`Isvisible`,
`Extent1`.`Isfrontpage`,
`Extent1`.`Istoparticle`,
`Extent1`.`Expires_date`,
`Extent1`.`日期`
FROM `tcms_articles` AS `Extent1`
 WHERE `Extent1`.`Expires_date` >= '2012-06-24 13:41:47.816') AS `Project1`
 订购方式
`Project1`.`Date` DESC LIMIT 4

执行此查询大约需要 3.50 秒。

解释这个查询:

+----+-------------+------------+-------+--------- ------+--------------+----------+------+------+---- ------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+------------+-------+--------- ------+--------------+----------+------+------+---- ------------+
| 1 | 初级 | | 全部 | 空 | 空 | 空 | 空 | 4054 | 使用文件排序 |
| 2 | 派生 | 范围1 | 范围 | 过期日期 | 过期日期 | 8 | 空 | 4053 | 使用位置 |
+----+-------------+------------+-------+--------- ------+--------------+----------+------+------+---- ------------+

当我查询时:

SELECT *
    FROM tcms_articles
    WHERE expires_date >= '2012-06-24 13:41:47.816'
    ORDER BY date DESC
    limit 4

我得到0.01秒...

再次运行解释我得到:

+----+-------------+---------------+-------+------ ------+------+---------+------+------+------ ----+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+---------------+-------+------ ------+------+---------+------+------+------ ----+
| 1 | 简单 | tcms_articles | 索引 | 过期日期 | 日期 | 8 | 空 | 11 | 使用位置 |
+----+-------------+---------------+-------+------ ------+------+---------+------+------+------ ----+

我不明白为什么会这样。

实体框架 4.3 MySQL 连接器网络 6.5.4.0

编辑 :

tcms_articles :

创建表`tcms_articles`(
  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `User_id` int(10) 无符号 DEFAULT NULL,
  `Category_id` int(10) 无符号 DEFAULT NULL,
  `标题` varchar(255) 默认为空,
  `值`长文本,
  `Keywords` varchar(255) NOT NULL DEFAULT '',
  `Description` varchar(255) NOT NULL DEFAULT '',
  `图片`长文本不为空,
  `Votes` int(10) unsigned NOT NULL DEFAULT '1',
  `Votes_sum` int(10) unsigned NOT NULL DEFAULT '5',
  `Views` int(10) unsigned NOT NULL DEFAULT '0',
  `Isvisible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `Isfrontpage` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `Istoparticle` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `Expires_date` datetime NOT NULL DEFAULT '2099-12-31 00:00:00',
  `日期`日期时间不为空,
  主键(`Id`),
  KEY `article_users` (`User_id`) 使用 BTREE,
  KEY `article_section` (`Category_id`) 使用 BTREE,
  KEY `Isvisible_index2` (`Isvisible`) 使用 BTREE,
  KEY `Istoparticle_index2` (`Istoparticle`) 使用 BTREE,
  KEY `Expires_date_index2` (`Expires_date`) 使用 BTREE,
  KEY `isfrontpage2` (`Isfrontpage`) 使用 BTREE,
  KEY `Date_index2` (`Date`) 使用 BTREE,
  约束 `tcms_articles_ibfk_1` 外键 (`Category_id`) 参考 `tcms_categories` (`Id`)
        在更新级联上删除级联,
  约束 `tcms_articles_ibfk_2` 外键 (`User_id`) 参考 `tcms_users` (`Id`)
        ON DELETE CASCADE ON UPDATE CASCADE
) 引擎=InnoDB AUTO_INCREMENT=80 默认字符集=utf8;

那么为什么 Linq 会产生这个查询以及如何/我可以解决这个问题?

4

1 回答 1

0
repo.GetQuery<Article>().Where(foo=>foo.Expires_date>=date  -- Note 1
                        && foo.Istoparticle==true
                        && foo.Isfrontpage==false)
                    .OrderByDescending(foo=>foo.Date)       -- Note 2
                    .Take(4);

两个地方都用foo.Expires_date

于 2017-05-14T22:55:21.063 回答