最近我使用Entity Framework Profiler来监控我生成的sql 实体框架;我发现有些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'
实际的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`
我不想要条件:或者频道`是空的(因为它不能为空,我用c#代码判断它),同时,我不想子查询;
我的代码或理解有问题吗? EF或mysql有什么问题吗? Entity Framework Profiler有什么问题吗?
帮助~~~~~
补充:
SELECT COUNT(1) FROM USER_T;
SELECT COUNT(c) FROM (
SELECT COUNT(1) as c FROM USER_T
) as t
测试数据很少;
有sql profile结果:即使有一些时差(测试数据很少,但显示不同的sql执行计划)
有照片
为了获得更好的性能,我们最好删除子查询;但是,linq生成子查询;