C# LINQ/EF按查询和计数优化分组

C# LINQ/EF按查询和计数优化分组,c#,sql,entity-framework,linq,entity-framework-core,C#,Sql,Entity Framework,Linq,Entity Framework Core,我试图用一个计数来做一个非常简单的分组,但是遇到了一些问题,因为LINQ抛出了一些非常可怕的SQL,正在超时。我正在运行EF7和ASP NET 5 这是我的密码- var counts = (from log in db.LogTable where proj.Contains(log.projId) group log by log.callTypeId into grp select new

我试图用一个计数来做一个非常简单的分组,但是遇到了一些问题,因为LINQ抛出了一些非常可怕的SQL,正在超时。我正在运行EF7和ASP NET 5

这是我的密码-

var counts = (from log in db.LogTable
              where proj.Contains(log.projId)
              group log by log.callTypeId into grp
              select new 
              { 
                  key = (from temp in callTypes where temp.Id == grp.Key select temp), 
                  count = grp.Count() 
              });
callTypes被缓存,LogTable包含超过1m条记录

我甚至尝试删除where子句,将键更改为从callTypes缓存中选择并只返回id,还添加了OrderByCallTypeID,但这两种方法都没有任何改进

正在执行的查询如下所示-

SELECT [log].[Id], [log].[callTypeId], [all other columns...] 
FROM [LogTable] AS [log] 
WHERE [log].[callTypeId] IN (1, 2, 3, 4, 5)
有人知道我是否有办法强制它“从LogTable中选择callTypeId,count(*)WHERE…GROUP BY callTypeId”来阻止它返回所有记录并在应用程序端进行分组吗?或者我需要恢复到存储过程吗

更新-

如上所述,将(来自callTypes中的temp,其中temp.Id==grp.Key select temp)替换为grp.Key会给出相同的查询,因此这不是问题所在


非常感谢

调用类型的确切类型是什么?当你说它是“缓存的”时,你是说它是一个
可缓存的
?如果它是内存中的实际数据,那么它在数据库的EF查询中没有任何业务。只需在
LogTable
上执行group by以获取计数,然后使用
callTypes
in-memory.callTypes在内存中进行键映射,但即使没有此选项,问题也会出现,即如果我选择new{key=grp.key,count=grp.count()}-SQL上的查询仍然相同,我甚至可以将其减少为-var counts=(从log in db.LogTable group log by log.callTypeId进入grp select new{key=grp.key,count=grp.count()});同样的问题也会发生key=(从callTypes中的temp开始,其中temp.Id==grp.key select temp)…非常确定在select语句中创建一个新查询是个坏主意。连接LogTable和calltypes,然后继续?这个问题称为“EF Core”。它在Sql生成(不仅仅是)部分有很多错误。但它有一个“功能”当无法将部分查询转换为SQL时,在内存中运行部分查询,这就是您得到的结果。在配置中添加以下行:
optionBuilder.ConfigureWarnings(bulder=>bulder.Throw(RelationalEventId.QueryClientEvaluationWarning))
你会明白我的意思。目前没有解决办法,请等待v.1.1或返回EF6@IvanStoev-谢谢!我似乎无法让ConfigureWarnings正常工作,因为它一直在说它不包含对此的定义…但我现在搜索了不同的内容,可以看到许多人有这个问题,这似乎是什么问题你是说。很遗憾,我在EF7中遇到了这么多问题,并试图解决这些问题,但我可能不得不让步,很快就会回到EF6……再次感谢。当你说它是“缓存”时,
callTypes
的确切类型是什么,你的意思是它是一个
IQuerable
?如果它是内存中的实际数据,那么它在数据库的EF查询中没有任何业务。只需在
LogTable
上进行分组,以获取计数,然后使用
callTypes
内存中进行键映射。callTypes在内存中,但即使没有这个,问题也会发生,即如果我选择了new{key=grp.key,count=grp.count()(来自callTypes中的temp,其中temp.Id==grp.Key select temp)…非常确定在select语句中创建一个新查询是个坏主意。连接LogTable和callTypes,然后继续?这个问题被称为“EF Core”。它在Sql生成(不仅仅是)部分中有很多错误。但它有一个“功能”当无法将部分查询转换为SQL时,在内存中运行部分查询,这就是您得到的结果。在配置中添加以下行:
optionBuilder.ConfigureWarnings(bulder=>bulder.Throw(RelationalEventId.QueryClientEvaluationWarning))
你会明白我的意思。目前没有解决办法,请等待v.1.1或返回EF6@IvanStoev-谢谢!我似乎无法让ConfigureWarnings正常工作,因为它一直在说它不包含对此的定义…但我现在搜索了不同的内容,可以看到许多人有这个问题,这似乎是什么问题很遗憾,我在EF7中遇到了这么多问题,并试图用自己的方式解决问题,但我可能不得不让步,很快就回到EF6了……再次感谢。