Команда SQL для LINQ (поворот)
Я перевожу БД из MySQL (используется ODBC) в MS SQL и хочу "перевести" SQL-запросы в LINQ. Может ли кто-нибудь помочь мне в этом (для каждого местоположения и результата группы по месяцам должен быть столбец SUM 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();
и это почти то, что мне нужно. Должна быть группировка по годам, и я не знаю, как это сделать.
2 ответа
Решение
Это может помочь.
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);
.. Знаете ли вы, как сделать добавление Locations для Select динамически? Например, из списка / массива.
РЕДАКТИРОВАТЬ: .. или, может быть, динамически загружать Locations и указывать, какие Locations следует загружать в операторе Where перед Select. Это возможно?