我有一个表存储3K条记录,
我对实体框架和ORM是个新手,但我能理解出了问题。
运行此linq查询时:
repo.GetQuery<Article>().Where(foo=>foo.Expires_date>=date
&& foo.Istoparticle==true
&& foo.Isfrontpage==false)
.OrderByDescending(foo=>foo.Date)
.Take(4);
我在mysql端得到以下查询:
SELECT `Project1`.`Id`, `Project1`.`User_id`, `Project1`.`Category_id`, `Project1`.`Title`, `Project1`.`Value`, `Project1`.`Keywords`, `Project1`.`Description`, `Project1`.`Images`, `Project1`.`Votes`, `Project1`.`Views`, `Project1`.`Isvisible`, `Project1`.`Isfrontpage`, `Project1`.`Istoparticle`, `Project1`.`Date`, `Project1`.`Expires_date`, `Project1`.`Votes_sum` FROM (SELECT `Extent1`.`Id`, `Extent1`.`User_id`, `Extent1`.`Category_id`, `Extent1`.`Title`, `Extent1`.`Value`, `Extent1`.`Keywords`, `Extent1`.`Description`, `Extent1`.`Images`, `Extent1`.`Votes`, `Extent1`.`Votes_sum`, `Extent1`.`Views`, `Extent1`.`Isvisible`, `Extent1`.`Isfrontpage`, `Extent1`.`Istoparticle`, `Extent1`.`Expires_date`, `Extent1`.`Date` FROM `tcms_articles` AS `Extent1` WHERE `Extent1`.`Expires_date` >= '2012-06-24 13:41:47.816') AS `Project1` ORDER BY `Project1`.`Date` DESC LIMIT 4
执行此查询大约需要3.50秒。
说明此查询:
+----+-------------+------------+-------+---------------+--------------+---------+------+------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+-------+---------------+--------------+---------+------+------+----------------+ | 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 4054 | Using filesort | | 2 | DERIVED | Extent1 | range | expires_date | expires_date | 8 | NULL | 4053 | Using where | +----+-------------+------------+-------+---------------+--------------+---------+------+------+----------------+
当我查询:
SELECT *
FROM tcms_articles
WHERE expires_date >= '2012-06-24 13:41:47.816'
ORDER BY date DESC
limit 4
我只有0.01秒...
跑着再解释一遍我得到:
+----+-------------+---------------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | tcms_articles | index | expires_date | date | 8 | NULL | 11 | Using where | +----+-------------+---------------+-------+---------------+------+---------+------+------+-------------+
我不明白为什么会这样。
Entity Framework 4.3 MySQL Connector Net 6.5.4.0
tcms_articles:
CREATE TABLE `tcms_articles` ( `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, `User_id` int(10) unsigned DEFAULT NULL, `Category_id` int(10) unsigned DEFAULT NULL, `Title` varchar(255) DEFAULT NULL, `Value` longtext, `Keywords` varchar(255) NOT NULL DEFAULT '', `Description` varchar(255) NOT NULL DEFAULT '', `Images` longtext NOT NULL, `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', `Date` datetime NOT NULL, PRIMARY KEY (`Id`), KEY `article_users` (`User_id`) USING BTREE, KEY `article_section` (`Category_id`) USING BTREE, KEY `Isvisible_index2` (`Isvisible`) USING BTREE, KEY `Istoparticle_index2` (`Istoparticle`) USING BTREE, KEY `Expires_date_index2` (`Expires_date`) USING BTREE, KEY `isfrontpage2` (`Isfrontpage`) USING BTREE, KEY `Date_index2` (`Date`) USING BTREE, CONSTRAINT `tcms_articles_ibfk_1` FOREIGN KEY (`Category_id`) REFERENCES `tcms_categories` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `tcms_articles_ibfk_2` FOREIGN KEY (`User_id`) REFERENCES `tcms_users` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
那么为什么Linq会产生这个查询,如何/可以修复这个问题呢?
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
。
问题内容: 我正在将子系统从 NHibernate 移植到 Entity Framework, 并希望看到将以下查询移植到 EF 的最佳方法。 帐户余额类别为: 该表是: 示例数据是(使用数字ID可以更好地理解): 该 AccountBalanceByDate 实体持有某一天的账户余额。如果某天没有交易,则该天将没有 AccountBalanceByDate ,我们应该查看前几天以查看该帐户的余额
1)使用的第一个查询...大约用了23秒 目前我修改了查询..这需要大约9秒 我不确定要做的表演是什么?我希望这个查询是快速的..我尝试索引rid和id,但这仍然使查询变得更糟。 下面是表格的详细信息 mza_movie_upload MZA_Movie_Statics
我对下面的查询有异步问题。我有单例上下文,我正在尝试执行以下查询: 我的单例上下文如下所示: 配置上下文工厂返回如下上下文: 在这我得到间歇性问题与以下错误: 在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在该上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。
我有5个SQL表 存储 工作人员 部门 SOLD_Items staff_rating 我创建了一个视图,将这四个表连接在一起。最后一个表(staff_rating),我希望在接近项目被出售的时间(sold_items.date)获得视图行的rating列。我尝试了以下SQL查询,这些查询工作正常,但存在性能问题。 SQL查询1 SQL查询2 SQL查询%2比SQL查询%1快。但这两种方法都存在性
实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯
我有这个问题。我希望它从内容表中选择4个条目,并按如下方式对条目进行排序: > 选择最近的条目。它表示按日期排序(mysql datetime)DESC,id DESC。 从这4个选定项中,按likes(mysql INT)DESC排序 运行查询时,它返回错误的结果。它选择与此条件匹配的条目,其中主题='id'和活动='1'。它按likes DESC对条目进行排序,但忽略了这个条件,即按日期DES