【发布时间】:2011-01-17 02:41:40
【问题描述】:
我想找到最快的方法来获取表中的列的最小值和最大值,只需一次 Linq 到 SQL 往返。所以我知道这将在两次往返中起作用:
int min = MyTable.Min(row => row.FavoriteNumber);
int max = MyTable.Max(row => row.FavoriteNumber);
我知道我可以使用group,但我没有group by 子句,我想汇总整个表格!如果不先分组,我就不能使用 .Min 。我确实尝试过:
from row in MyTable
group row by true into r
select new {
min = r.Min(z => z.FavoriteNumber),
max = r.Max(z => z.FavoriteNumber)
}
但是那个疯狂的 group 子句看起来很傻,而且它产生的 SQL 比它需要的复杂。
那么,有什么办法可以得到正确的 SQL 呢?
编辑:这些人也失败了:Linq to SQL: how to aggregate without a group by? ...如果真的没有答案,LINQ 设计人员的疏忽监督。
编辑 2:我在 SQL Server Management Studio 执行计划分析中查看了我自己的解决方案(使用无意义的常量 group by 子句),在我看来它与以下生成的计划相同:
SELECT MIN(FavoriteNumber), MAX(FavoriteNumber)
FROM MyTable
所以除非有人能想出一个更简单或同样好的答案,否则我认为我必须将其标记为自己回答。想法?
【问题讨论】:
-
为什么要求单次往返?
-
效率和整洁——看起来应该很简单,SQL也很简单:SELECT MIN(FavoriteNumber), MAX(FavoriteNumber) FROM MyTable... 所以LINQ也应该如此。
-
查看 SQL LINQ 输出内容的工具:ayende.com/Blog/archive/2010/02/20/…
-
我也大量使用过LinqPad,它也显示SQL,非常好用。
-
“它生成的 SQL 比它需要的更复杂” - 这不是 LINQ 的问题,而是分析您的 linq 表达式并将其转换为 SQL 的底层 LINQ 提供程序。 LINQ 只定义约束和结果。如果 Provider 正确分析并减少了查询,那么生成的 SQL 将只是“从 X 中选择 min() max()”,就像计划分析器向您展示的那样。如果您遇到笨拙的 SQL,请考虑更改您的提供程序库或将其更新到新版本:) 无论如何,按常量分组是表达您所需查询的绝对有效和正确的方式。
标签: c# sql linq-to-sql