Sco*_*ord 27 c# sql linq-to-sql
我想找到一个最快的方法来获得一个表中的列的最小值和最大值,其中只有一个Linq to 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) 
}
但是这个疯狂的组子句似乎很愚蠢,而它所做的SQL比它需要的更复杂.
那么,有没有办法只是得到正确的SQL?
编辑:这些家伙也失败了:Linq to SQL:如何在没有小组的情况下聚合?......如果真的没有答案,LINQ设计师的疏忽.
编辑2:我在SQL Server Management Studio执行计划分析中查看了我自己的解决方案(使用无意义的常量group by子句),它在我看来它与生成的计划完全相同:
SELECT MIN(FavoriteNumber), MAX(FavoriteNumber)
FROM MyTable
因此,除非有人能够提出一个更简单或同样好的答案,我想我必须将其标记为自己回答.思考?
Sco*_*ord 31
正如问题中所述,这种方法似乎实际上生成了最佳的SQL代码,因此虽然它在LINQ中看起来有点松懈,但它应该是性能最佳的.
from row in MyTable  
group row by true into r  
select new {  
    min = r.Min(z => z.FavoriteNumber),  
    max = r.Max(z => z.FavoriteNumber)  
} 
我只能发现这一个产生一些干净的sql仍然没有真正有效,相比于表中的select min(val),max(val):
var r =
  (from min in items.OrderBy(i => i.Value)
   from max in items.OrderByDescending(i => i.Value)
   select new {min, max}).First();
sql是
SELECT TOP (1)
    [t0].[Value],
    [t1].[Value] AS [Value2]
FROM
    [TestTable] AS [t0],
    [TestTable] AS [t1]
ORDER BY
    [t0].[Value],
    [t1].[Value] DESC
仍然有另一种选择为最小和最大查询使用单一连接(请参阅多个活动结果集(MARS))
或存储过程..