SQL命令转换为LINQ(数据透视)

3
我正在将数据库从使用ODBC的MySQL迁移到MS SQL,我想要将SQL查询“翻译”为LINQ。有人能帮我吗(它应该对每个位置的Charge列求和,并按月份分组结果):
SELECT
sum(case when Location="Location1" then Charge else 0 end) as Location1,
sum(case when Location="Location2" then Charge else 0 end) as Location2,
sum(case when Location="Location3" then Charge else 0 end) as Location3,
MAKEDATE(YEAR(OrderTime),DAYOFYEAR(OrderTime)) AS date FROM Sales
GROUP BY YEAR(OrderTime),MONTH(OrderTime)
ORDER BY OrderTime DESC 

?

输出应该像这样:

Location1 | Location2 | Location3 | date

编辑:

我尝试使用这里的LINQ示例:

是否可能使用LINQ来透视数据?

var query = context.log_sales
                            .GroupBy(c => c.OrderTime)
                            .Select(g => new
                            {
                                Date = g.Key,
                                Location1 = g.Where(c => c.Location == "Location1").Sum(c => c.Charge) ?? 0,
                                Location2 = g.Where(c => c.Location == "Location2").Sum(c => c.Charge) ?? 0
                            }).ToList();

这几乎是我所需要的,但还需要按年份分组,我不知道如何做到这一点。


正在处理答案...只是想提一下,在SQL中的ORDER BY无效。OrderTime已经被分组并且不能在那里使用。 - Amy B
2个回答

6
这可能有所帮助。
context.log_sales
.GroupBy(s => new {Year = OrderTime.Year, Month = OrderTime.Month})
.Select
( g => new {
  Date = new DateTime(g.Key.Year, g.Key.Month, 1),
  Location1 = g.Where(s => s.Location == "Location1").Sum(s => s.Charge),
  Location2 = g.Where(s => s.Location == "Location2").Sum(s => s.Charge),
  Location3 = g.Where(s => s.Location == "Location3").Sum(s => s.Charge),
  }
)
.OrderBy(x => x.Date);

你有检查过这个Linq表达式生成的SQL吗?它非常庞大。 - GrZeCh

0

你知道怎么动态地将位置添加到选择器中吗?例如从列表/数组中。

编辑:或者是动态加载位置并在选择之前设置应该加载哪些位置。这可行吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接