作为第10组,Linq获得前9名组和所有其他组的总和

时间:2012-05-13 08:56:21

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

在LINQ中是否可以这样做:按字段分组(LineTotal),仅返回前9个组,然后在第10个组中返回所有其他组的总和?

在SQL Server中,可以这样做:

with TopGroups as 
(
    select sum(sol.LineTotal) as ProductGroupSales, p.ProductGroupId,
    ROW_NUMBER() OVER(ORDER BY sum(sol.LineTotal) DESC) as Num
    from SalesOrderLines sol left join Products p on p.Id = sol.ProductId
    group by p.ProductGroupId
)
select ProductGroupSales from TopGroups where Num < 10
union all
select sum(ProductGroupSales) from TopGroups where Num >= 10

这可以转换为LINQ吗?我不确定ROW_NUMBER() OVER()union all如何转换为LINQ。

1 个答案:

答案 0 :(得分:1)

  1. 您可以使用“.Take(9)”和“.Skip(0).Take(1)”翻译行号。
  2. UNION ALL映射到seqA.Concat(seqB)
  3. CTE仅映射到包含查询的变量。像这样:
  4. -

    var q1 = SalesOrderLines.Where(...);
    var q2 = q1.Concat(q1); //reused q1 multiple times for q2 like a CTE
    

    所有这些基本上都没有SQL方面的性能成本。