优化Linq到MySql

时间:2018-06-06 05:45:51

标签: c# linq entity-framework-6 profiler

最近我使用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执行计划)

有照片

enter image description here

enter image description here

为了获得更好的性能,我们最好删除子查询;但是,linq生成子查询;

0 个答案:

没有答案