实体框架核心+按分组计数

时间:2018-11-23 13:57:59

标签: linq entity-framework-core

我有一个表,其中包含约60万条记录和33列。在我的项目中,我正在使用EF Core(2.0.1)从数据库检索数据。我遇到以下代码的问题:

 var theCounter = (from f in _context.tblData.Take(100000)
         group f by f.TypeId into data
         select new DataDto { ID = data.Key, Count = data.Count() }).ToList();

此代码是REST API的一部分,当我从SOAP UI测试它时,我开始超时错误。当我测试

的代码时
  

取(1000)

大约有300个唯一的TypeId。 它工作正常。有什么想法可以使它起作用吗?

-编辑1:

这是调试代码时看到的内容:

Microsoft.EntityFrameworkCore.Query:Warning: Query: '(from TblData <generated>_1 in DbSet<TblData> select [<generated>_1]).Take(__p_0)' uses a row limiting operation (Skip/Take) without OrderBy which may lead to unpredictable results.
Microsoft.EntityFrameworkCore.Query:Warning: Query: '(from TblData <generated>_1 in DbSet<TblData> select [<generated>_1]).Take(__p_0)' uses a row limiting operation (Skip/Take) without OrderBy which may lead to unpredictable results.
Microsoft.EntityFrameworkCore.Query:Warning: The LINQ expression 'GroupBy([f].TypeId, [f])' could not be translated and will be evaluated locally.
Microsoft.EntityFrameworkCore.Query:Warning: The LINQ expression 'GroupBy([f].TypeId, [f])' could not be translated and will be evaluated locally.
Microsoft.EntityFrameworkCore.Query:Warning: The LINQ expression 'Count()' could not be translated and will be evaluated locally.
Microsoft.EntityFrameworkCore.Database.Command:Information: Executed DbCommand (131ms) [Parameters=[@__p_0='?'], CommandType='Text', CommandTimeout='30']
SELECT [t2].[Id], [t2].[at], [t2].[add], [t2].[AddDate], [t2].[aftc], [t2].[aftcd], [t2].[aid], [t2].[afl], [t2].[prdid], [t2].[cid], [t2].[TypeId], [t2].[env], [t2].[ext], [t2].[extddcode], [t2].[fn], [t2].[fn], [t2].[fic], [t2].[gid], [t2].[grp], [t2].[hnm], [t2].[IP], [t2].[icid], [t2].[ln], [t2].[lg], [t2].[pcid], [t2].[ret], [t2].[rts], [t2].[rnam], [t2].[sled], [t2].[seq], [t2].[sid], [t2].[styp]
FROM (
    SELECT TOP(@__p_0) [t1].[Id], [t1].[at], [t1].[add], [t1].[AddDate], [t1].[aftc], [t1].[aftcd], [t1].[aid], [t1].[afl], [t1].[prdid], [t1].[cid], [t1].[TypeId], [t1].[env], [t1].[ext], [t1].[extddcode], [t1].[fn], [t1].[fn], [t1].[fic], [t1].[gid], [t1].[grp], [t1].[hnm], [t1].[IP], [t1].[icid], [t1].[ln], [t1].[lg], [t1].[pcid], [t1].[ret], [t1].[rts], [t1].[rnam], [t1].[sled], [t1].[seq], [t1].[sid], [t1].[styp]
    FROM [TblData] AS [t1]
) AS [t2]
WHERE [t2].[TypeId] IS NOT NULL
ORDER BY [t2].[TypeId]

我认为翻译不正确。有什么想法吗?

-编辑2:

我已将查询更改为:

    var query = _context.TblData
        .Select(a => new {ID = a.Id, TypeId= a.TypeId})
        .Distinct();

    var q1 = query.GroupBy(p => p.TypeId)
        .Select(g => new DataDto {TypeId= g.Key, Count = g.Count()});

    return await q1.ToListAsync();

但是它被翻译为:

SELECT DISTINCT [a0].[Id], [a0].[TypeId] AS [TypeId]
FROM [tblData] AS [a0]
ORDER BY [a0].[TypeId]

当我直接在数据库中检查时,此查询需要14秒才能执行。不知道为什么它没有被翻译成类似这样的东西:

SELECT DISTINCT [a0].[Id], COUNT([TypeId]) AS [TypeId]
FROM [tblData] AS [a0]
GROUP BY COUNT([a0].[Id])
ORDER BY [a0].[TypeId]

1 个答案:

答案 0 :(得分:1)

我不得不将EF Core版本升级到2.1,并且LINQ现在可以正确转换为SQL。