У меня серьезная проблема с 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 [это было интересно установить], и DevCont dotConnect для MySQL, и оба дали одинаковые результаты. Эта таблица содержит 1,5 миллиона записей .. и для ее выполнения требуется 6-11 секунд!
Что я делаю не так? Есть ли способ оптимизировать этот [и другие запросы] для получения вменяемого кода, например:
SELECT COUNT(*) FROM table
Генерация одного и того же запроса с использованием SQLServer практически не занимает много времени и дает вменяемый код.
Помощь!
Редактировать: Я также хотел бы отметить, что я переключился на драйвер DevArt dotConnect MySQL LINQ to SQL и использование L2S через 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
Опять совершенно неправильный запрос. ПРЕДЕЛ 100,100 находится в абсолютно неправильном месте. Это, конечно, не будет работать для меня вообще.