为什么LINQ to SQL将GroupBy转换为多个查询

时间:2014-04-02 15:45:20

标签: c# sql-server linq linq-to-sql

我注意到甚至比使用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}之前调用ToListGroupBy或者我的表现降低了。更糟糕的是,它迫使我完成LINQ to SQL查询并继续LINQ to Objects

我已使用LINQ to EntitiesLINQ to SQL(通过LINQPad)对此进行了测试,DBMS为SQL Server

我错过了什么吗?这是设计还是有任何方法来编写LINQ查询,以便使用SQL GROUP BY而不是生成多个单独的查询?

1 个答案:

答案 0 :(得分:2)

您需要更改您的select语句,以便它更友好。

更改:select g

这样的事情:

select new
{
  g.Key,
  Count = g.Count(),
};