【发布时间】: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 之前我必须非常小心地调用AsEnumerable 或ToList,否则我的性能会下降.更糟糕的是,它迫使我完成我的LINQ to SQL 查询并继续LINQ to Objects。
我已经使用LINQ to Entities 和LINQ to SQL(通过LINQPad)对此进行了测试,DBMS 是SQL Server。
我错过了什么吗?这是设计使然,还是有任何方法可以编写 LINQ 查询以使用 SQL 的 GROUP BY 而不是生成多个单独的查询?
【问题讨论】:
-
SQL 的 group by 和 LINQ 的 group by 做的事情截然不同。它们之间没有1-1映射。如果您编写了一个
GroupByLINQ 查询实际上可以由 翻译成一个SQL 组,那么它可能会这样做。 -
@Servy 谢谢。是的,显然大多数 LINQ 到 SQL 的翻译都是这种情况,但是,这是如何决定的?我想它一定是确定性的,为什么显然最简单的 LINQ
GroupBy查询最终没有使用 SQLgroup by? -
有一个查询翻译器的工作是将代码从表达式树翻译成SQL。有时它可以做得很好,有时它可以做到,但没有你想要的那么好,有时它就是不能。
标签: c# sql-server linq linq-to-sql