EntityFramework中的“Group by”未包含在SQL语句中

3

我正在尝试创建类似于以下查询的查询:

select randomId 
from myView
where ...
group by randomId

注意:EF不支持distinct,因此我考虑用group by绕过它(或者我这么认为)
randomId是数字
Entity Framework V.6.0.2
这个查询在不到1秒的时间内给出了我期望的结果
当尝试使用EF执行相同操作时,我遇到了一些问题。
如果我使用类似于此的LINQ:
context.myView
.Where(...)
.GroupBy(mt => mt.randomId)
.Select({ Id = group.Key, Count = group.Count() } )

我将得到类似的结果,但是通过强制使用count并使查询时间超过6秒。

EF生成的SQL大致如下:

SELECT 
1 AS [C1],
[GroupBy1].[K1] AS [randomId],
[GroupBy1].[A1] AS [C2]
FROM ( 
SELECT 
     [Extent1].[randomId] AS [K1],
     COUNT(1) AS [A1]
     FROM [dbo].[myView] AS [Extent1]
     WHERE (...)
     GROUP BY [Extent1].[randomId]
)  AS [GroupBy1]

但是,如果查询中注释掉了 count 部分,执行时间会降至小于 1 秒。

如果我将 Select 更改为以下内容:

.Select({ Id = group.Key} )

在SQL查询中,我将获取所有没有group by语句和无需Distinct的行:

SELECT 
[Extent1].[anotherField] AS [anotherField], -- 'this field got included automatically on this query and I dont know why, it doesnt affect outcome when removed in SQL server'
[Extent1].[randomId] AS [randomId]
FROM [dbo].[myView] AS [Extent1]
WHERE (...)

其他失败的尝试:

query.GroupBy(x => x.randomId).Select(group => group.FirstOrDefault());

生成的查询如下所示:
SELECT 
    [Limit1].ALL FIELDS,...
    FROM  (SELECT 
        [Extent1].[randomId] AS [randomId]
        FROM [dbo].[myView] AS [Extent1]
        WHERE (...) AS [Project1]
    OUTER APPLY  (SELECT TOP (1) 
        [Extent2].ALL FIELDS,...
        FROM [dbo].[myView] AS [Extent2]
        WHERE (...) AS [Limit1] -- same as the where above

这个查询表现不佳,却仍然成功返回了where子句的所有ID。
有没有人有办法强制使用group by而不需要像count这样的聚合函数?
在SQL中它可以工作,但我也使用了distinct关键字...
干杯, J

@SergeyBerezovskiy 目前我是用*query.GroupBy(x => x.randomId).Select(group => new { ID = group.Key }).ToList()*做的,但输出结果中会有重复的“randomId”值。 此外,Glimpse查询并不显示Distinct*和group by*。 - JSilva
也许您认为值是重复的?例如,检查空格。此外,“distinct”应该存在于生成的查询中。 - Sergey Berezovskiy
randomId是一个数字列,因此我不能有空格,查询仍然没有去重。编辑帖子以说明我正在使用的EF版本! - JSilva
@JSilva 嗯,我有EF版本6.0.0.0,但我不认为那是问题所在。另外,在结果中包含[anotherField]对我来说看起来很奇怪。请确保应用了分组。 - Sergey Berezovskiy
大家好,抱歉回复有些晚,不过我已经找到问题/答案了。虽然当时我只在服务器端进行工作,但视图被重新创建,并且某些内部/左连接发生了变化。这使得查询速度更快,但由于我没有意识到这一点,大多数代码映射都是错误的(必需的、可空的等),导致EF不能正确地创建查询。现在,字段没有改变,但通过检查属性映射并在查询中添加distinct来解决了问题。我没有进一步调查为什么EF会在这种情况下出现问题。 - JSilva
显示剩余5条评论
1个回答

0
var query = from p in TableName 
        select new {Id = p.ColumnNameId};
var distinctItems = query.Distinct().ToList();

这里是linq查询,但你也应该能够从EF dbset中编写等效的查询。如果有问题,请告诉我。

干杯!


我已经追踪了它生成的 SQL,它类似于 SELECT DISTINCT [t0].[ColumnNameId] AS [Id] FROM [TableName] AS [t0]。 - user3660227

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接