我注意到甚至比使用GroupBy的更简单的LINQ查询也被转换为与组密钥一样多的SQL查询。我还没有找到任何关于为什么会发生这种情况或者我如何避免它的解释。
例如,查询:
from p in People group p by p.Name into g select g
被转换为与selects
列不同的Name
个-- Region Parameters
DECLARE @x1 VarChar(20) SET @x1 = 'John'
-- EndRegion
SELECT [t0].[Name], [t0].[SurName]
FROM [People] AS [t0]
WHERE ((@x1 IS NULL) AND ([t0].[Name] IS NULL))
OR ((@x1 IS NOT NULL) AND ([t0].[Name] IS NOT NULL) AND (@x1 = [t0].[Name]))
GO
,就像这一个:
AsEnumerable()
但是,如果我将整个表格带入内存,例如调用from p in People.AsEnumerable() group p by p.Name into g select g
,
AsEnumerable
只发出一个select,检索所有行,然后LINQ在内存中执行分组。
我发现这种行为相当混乱且容易出错,因为我经常发现自己在不同的语句中编写复杂的查询,我必须小心谨慎,在执行{{1}之前调用ToList
或GroupBy
或者我的表现降低了。更糟糕的是,它迫使我完成LINQ to SQL
查询并继续LINQ to Objects
。
我已使用LINQ to Entities
和LINQ to SQL
(通过LINQPad
)对此进行了测试,DBMS为SQL Server
。
我错过了什么吗?这是设计还是有任何方法来编写LINQ查询,以便使用SQL GROUP BY
而不是生成多个单独的查询?
答案 0 :(得分:2)
您需要更改您的select语句,以便它更友好。
更改:select g
这样的事情:
select new
{
g.Key,
Count = g.Count(),
};