2010-05-21 24 views
7

Tengo un problema serio con MySQL y Entity Framework 4.0. He dejado caer una tabla en la superficie de EF Designer, y todo parece estar bien. Sin embargo, cuando realizo una consulta de la siguiente manera:C# Entidad FrameWork MySQL Cuentas lentas Count()

using(entityContext dc = new entityContext()) { 
    int numRows = dc.myTable.Count(); 
} 

La consulta que se genera se ve algo como esto:

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` 

Como debería ser evidente, se trata de una consulta insoportablemente sin optimizar. ¡Está seleccionando cada fila! Esto no es óptimo, ni siquiera es posible para mí usar MySQL + EF en este punto.

He intentado tanto el MySQL 6.3.1 [que fue divertido de instalar] como el dotConnect de DevArt para MySQL y ambos producen los mismos resultados. Esta tabla tiene 1,5 millones de registros ... ¡y tarda de 6-11 segundos en ejecutarse!

¿Qué estoy haciendo mal? ¿Hay alguna manera de optimizar esto [y otras consultas] para producir código como el siguiente:

SELECT COUNT(*) FROM table 

?

Generar la misma consulta utilizando SQLServer no lleva prácticamente tiempo y produce un código correcto.

¡Ayuda!

Editar: También me gustaría señalar que cambié al controlador DevCon dotConnect MySQL LINQ to SQL y usar L2S sobre EF es 1000000x más rápido. Esto incluye consultas también.

Al seleccionar cualquier cosa en EF parece generar dudas completamente absurdas.

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 

Una vez más, una consulta completamente equivocada. El LIMIT 100,100 está absolutamente en el lugar equivocado. Esto por supuesto, no funcionará para mí en absoluto.

+0

¿Qué ocurre cuando reescribe la consulta de la siguiente manera: int numRows = dc.myTable.Select (a => a.AnyColumnInPricingTable) .Count(); –

+0

Supongo que no ... salida idéntica a la anterior. –

Respuesta

7

El problema puede estar asociado con el hecho de que tiene Definir consulta en su archivo .edmx o .edml.
El diseñador genera DefiningQuery a menudo en caso de que tenga una vista, o su tabla no tiene definida la clave principal. Verifique el código XML de su modelo y elimine DefiningQuery en caso de que esté presente pero no sea necesario.

+0

+1. Y si no tiene un PK en una mesa, agréguelo. Si no tiene una clave definida en EDMX para una vista, agregue eso también. –

+0

OH ¡guau! ¿Hay alguna forma de establecer esto/evitar esto en el diseñador, o la edición siempre es un requisito? Tenías toda la razón, había un DefiningQuery que estaba siendo aprobado. Esto es lo que recibo por ser un EF Newb. El MySQL L2S funcionó muy bien, que es lo que hice mientras esperaba. Gracias Devart! –

+0

Seguimiento - Probado, y este fue de hecho el problema. Te daría totalmente más puntos si pudiera. Gracias por señalar esto. Afortunadamente, hay alguna otra manera que no sea editar el XML para el EDMX, pero estoy feliz de saber cuál es el problema y esta solución. –