【问题标题】:Why does LINQ to SQL translate GroupBy into multiple queries为什么 LINQ to SQL 将 GroupBy 转换为多个查询
【发布时间】:2014-04-02 15:45:20
【问题描述】:

我注意到,甚至我使用 GroupBy 的更简单的 LINQ 查询都被转换为与组键一样多的 SQL 查询。我没有找到任何解释为什么会发生这种情况或如何避免它。

例如,查询:

from p in People group p by p.Name into g select g

被翻译成与Name 列的不同值一样多的selects,就像这个:

-- 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

只发出一次选择,检索所有行,然后 LINQ 在内存中执行分组。

我发现这种行为相当混乱且容易出错,因为我经常发现自己在不同的语句中编写复杂的查询,并且在执行GroupBy 之前我必须非常小心地调用AsEnumerableToList,否则我的性能会下降.更糟糕的是,它迫使我完成我的LINQ to SQL 查询并继续LINQ to Objects

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

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

【问题讨论】:

  • SQL 的 group by 和 LINQ 的 group by 做的事情截然不同。它们之间没有1-1映射。如果您编写了一个GroupBy LINQ 查询实际上可以由 翻译成一个SQL 组,那么它可能会这样做。
  • @Servy 谢谢。是的,显然大多数 LINQ 到 SQL 的翻译都是这种情况,但是,这是如何决定的?我想它一定是确定性的,为什么显然最简单的 LINQ GroupBy 查询最终没有使用 SQL group by
  • 有一个查询翻译器的工作是将代码从表达式树翻译成SQL。有时它可以做得很好,有时它可以做到,但没有你想要的那么好,有时它就是不能。

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


【解决方案1】:

您需要更改您的 select 语句,使其对 SQL 更友好。

更改:select g

到这样的事情:

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

【讨论】:

  • 谢谢。我认为查询很容易转换为 SQL group by,因为它只涉及聚合函数和聚合列,但是当我们还需要检索组中的项目时会发生什么?有没有办法编写 LINQ 查询以便生成单个 SQL 查询 - 或至少增加机会?
  • @jnovo - GROUP BY 子句用于将具有共同值的行投影到较小的行集中。 GROUP BY 通常与 SQL 聚合函数结合使用,或用于从结果集中消除重复行。如果你想要所有的行,那么使用People.AsEnumerable() 没有任何问题
猜你喜欢
  • 2017-10-06
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多