Оптимизация Linq для MySql - PullRequest
0 голосов
/ 06 июня 2018

В последнее время я использую Entity Framework Profiler для мониторинга моего sql, генерирующего из Entity Framework;Я нахожу, что некоторые sql не то, что я хочу;

вот детали пакета:

  <package id="EntityFramework" version="6.1.3" targetFramework="net452" />
  <package id="MySql.Data" version="6.9.11" targetFramework="net452" />
  <package id="MySql.Data.Entity" version="6.9.7" targetFramework="net452" />

есть код c # 1

    public void TestCount()
    {
        using (Model1 context = new Model1())
        {
            int count=context.GameUsers.Count();
        }
    }

что я ожидаю, sqlкак это : (некоторые из них)

select count(1) from User;

select count(*) from User;

select count(userId) from User;

Howerve, фактический sql это:

   SELECT `GroupBy1`.`A1` AS `C1`
   FROM   (SELECT COUNT(1) AS `A1`
   FROM   `USER_T` AS `Extent1`) AS `GroupBy1`

почему существует подзапрос?как я могу оптимизировать?

вот код 2;

  public void TestString()
        {
            string paramsFromInput = "12000"; 

            using (Model1 context = new Model1())
            {
                if(!string.IsNullOrEmpty(paramsFromInput))
                {
                    int count=context.GameUsers.Where(x => x.channel == paramsFomrInput).Count();
                }  
            }
        }

то, что я ожидаю, sql выглядит так:

select count(1) from User where channel='1200'

Howerver фактический sql это:

SELECT `GroupBy1`.`A1` AS `C1`
FROM   (SELECT COUNT(1) AS `A1`
        FROM   `USER_T` AS `Extent1`
        WHERE  (`Extent1`.`channel` = '12000' /* @p__linq__0 */)
                OR ((`Extent1`.`channel` IS NULL)
                    AND ('12000' /* @p__linq__0 */ IS NULL))) AS `GroupBy1`

Я не хочу, где условие: или channel` IS NULL (потому что он не может быть нулевым, я оцениваю это в коде c #), в то же время я не хочуподзапрос;

Есть ли проблемы с моим кодом или пониманием?Есть ли проблемы с EF или MySQL?Есть ли какие-либо проблемы с Entity Framework Profiler?

help ~~~~~

дополнение:

SELECT COUNT(1) FROM USER_T;

SELECT COUNT(c) FROM (

SELECT COUNT(1) as c FROM USER_T

) as t

тестовых данных немного;

есть результат профиля SQL: даже есть небольшая разница во времени (тестовые данные немногочисленны, но показан другой план выполнения SQL)

есть фотографии

enter image description here

enter image description here

, поэтому для лучшей производительности лучше удалить subQuery;однако linq генерирует подзапрос;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...