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.
¿Qué ocurre cuando reescribe la consulta de la siguiente manera: int numRows = dc.myTable.Select (a => a.AnyColumnInPricingTable) .Count(); –
Supongo que no ... salida idéntica a la anterior. –