C#实体框架MySQL慢速查询计数()

C#实体框架MySQL慢速查询计数(),c#,mysql,entity-framework,C#,Mysql,Entity Framework,我对MySQL和EntityFramework4.0有一个严重的问题。我把一张桌子放在EF Designer的表面上,一切看起来都很好。但是,当我以以下方式执行查询时: using(entityContext dc = new entityContext()) { int numRows = dc.myTable.Count(); } 生成的查询如下所示: SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT Count(1) AS `A1`

我对MySQL和EntityFramework4.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

同样,一个完全错误的查询。限制100100绝对是在错误的地方。当然,这对我根本不起作用。

问题可能与您在.edmx或.edml文件中有定义查询这一事实有关

如果您有视图,或者您的表没有定义主键,设计器通常会生成DefiningQuery。请检查模型的XML代码,并删除定义查询,以防它存在但不必要。

重写查询时会发生什么:int numRows=dc.myTable.Select(a=>a.AnyColumnInPricingTable.Count();我不骗你。。与上述输出相同。+1。如果你在一张桌子上没有PK,就添加它。如果没有在EDMX中为视图定义键,也可以添加该键。噢,哇!有没有办法在设计器中设置/避免这种情况,或者编辑始终是一项要求?你完全正确,有一个正在传递的定义查询。这就是我作为EF新手所得到的。L2S MySQL运行得很好,这就是我在等待时所做的。谢谢你,德瓦特!后续测试,这确实是问题所在。如果可以的话,我会给你更多的分数。谢谢你指出这一点。希望除了为EDMX编辑XML之外,还有其他方法,但我很高兴知道问题所在以及解决方案。