Команда 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();

и это почти то, что мне нужно. Там тоже должна быть группировка по годам, а я не знаю, как это сделать.


person GrZeCh    schedule 08.10.2008    source источник
comment
Работаю над ответом... просто хотел упомянуть, что ORDER BY в sql недействителен. OrderTime был сгруппирован и не может использоваться там.   -  person Amy B    schedule 08.10.2008


Ответы (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);
person Amy B    schedule 08.10.2008
comment
Вы проверили, какой SQL генерирует это выражение Linq? Это довольно ОГРОМНО. - person GrZeCh; 09.10.2008

.. Знаете ли вы, может быть, как сделать добавление локаций для выбора динамическим? Например, из списка/массива.

РЕДАКТИРОВАТЬ: .. или, может быть, сделать так, чтобы местоположения загружались динамически и устанавливали, какие местоположения должны быть загружены в операторе Where перед Select. Это возможно?

person GrZeCh    schedule 09.10.2008