В последнее время я использую 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](https://i.stack.imgur.com/KPL2J.jpg)
![enter image description here](https://i.stack.imgur.com/HF495.jpg)
, поэтому для лучшей производительности лучше удалить subQuery;однако linq генерирует подзапрос;