我遇到了MySQL和Entity Framework 4.0的严重问题。我已将表格放到EF Designer表面上,一切似乎都没问题。但是,当我以下列方式执行查询时:
using(entityContext dc = new entityContext()) {
int numRows = dc.myTable.Count();
}
生成的查询如下所示:
SELECT `GroupBy1`.`A1` AS `C1`
FROM (SELECT Count(1) AS `A1`
FROM (SELECT `pricing table`.`a`,
`pricing table`.`b`,
`pricing table`.`c`,
`pricing table`.`d`,
`pricing table`.`e`,
`pricing table`.`f`,
`pricing table`.`g`,
`pricing table`.`h`,
`pricing table`.`i`
FROM `pricing table` AS `pricing table`) AS `Extent1`) AS `GroupBy1`
显而易见,这是一个极其未经优化的查询。它正在选择每一行!这不是最优的,我甚至不可能在此时使用MySQL + EF。
我已经尝试了MySQL 6.3.1 [安装很有趣]和DevArt的dotConnect for MySQL,两者都产生了相同的结果。这个表有150万条记录..并且需要6-11秒才能执行!
我做错了什么?是否有任何方法可以优化此[和其他查询]以生成合理的代码,如:
SELECT COUNT(*) FROM table
使用SQLServer生成相同的查询几乎没有时间,并生成合理的代码。
帮助!
编辑:我还想指出,我切换到DevArt dotConnect MySQL LINQ to SQL驱动程序,使用L2S over EF的速度提高了1000000倍。这也包括查询。
在EF中选择任何似乎会产生完全疯狂的查询。
dc.pricing_table.OrderBy(j => j.a).Skip(100).Take(100).ToList();
SELECT `Extent1`.`a`,
`Extent1`.`b`,
`Extent1`.`c`,
`Extent1`.`d`,
`Extent1`.`e`,
`Extent1`.`f`,
`Extent1`.`g`,
`Extent1`.`h`,
`Extent1`.`i`
FROM (SELECT `pricing table `.`a`,
`pricing table `.`b`,
`pricing table `.`c`,
`pricing table `.`d`,
`pricing table `.`e`,
`pricing table `.`f`,
`pricing table `.`g`,
`pricing table `.`h`,
`pricing table `.`i`
FROM `pricing table ` AS `pricing table`) AS `Extent1`
ORDER BY `a` ASC
LIMIT 100,100
再次,一个完全低估的错误查询。 LIMIT 100,100绝对是错误的地方。这当然不会对我有用。
答案 0 :(得分:7)
问题可能与您在.edmx或.edml文件中定义查询有关。
如果您有View,或者您的表没有定义主键,Designer通常会生成DefiningQuery。请检查模型的XML代码并删除DefiningQuery,以防它存在但不必要。