Нужна помощь группы Linq2Sql, пожалуйста - PullRequest
0 голосов
/ 27 марта 2009

Мне нужно отобразить историю всех наших Products, которые мы продали по дням, неделям, месяцам и годам. Эти данные будут отправлены в API Google Maps для отображения линейного графика результатов.

Итак, если у меня есть таблица с именем Products и она выглядит следующим образом: -

Продукты

ProductID INT
DateCreated DATETIMEOFFSET

и пользователь просит просмотреть историю для ProductID 1. Как я могу получить это? например, вывод.

График 1 (даты и количество продаж)

Monday 1st Dec: 0
Tuesday 2nd Dec: 3
Wed 3rd Dec: 1

График 2 (количество недель против продаж)

Week 49 2008: 21
Week 50 2008: 11
Week 51 2008: 45
Week 52 2008: 0

График 3 (Количество месяцев против продаж)

Dec 08: 102
Jan 09: 23

Я не уверен, что «по дням» можно сделать ... или что-нибудь из этого.

ура :) 1023 *

Обновление 1: часть работала ...

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

from p in Products
where p.ProductId == 69
group p.DateCreated by p.DateCreated.Date into grouping
orderby grouping.Key
select new { Date = grouping.Key, Count = grouping.Count() }

Ответы [ 3 ]

1 голос
/ 27 марта 2009
var data = from p in ctx.Products
           where p.ProductID == *productId*
           group p by p.DateCreated.DayOfWeek into groupedProducts
           select new { DayOfWeek = groupedProducts.Key, Count = groupedProcuts.Count() };

Без тестирования я думаю, что может сделать это для вас

Чтобы сделать это за год что-то вроде этого:

var data = from p in ctx.Products
           where p.ProductID == *productId*
           group p by n.CreateDate.Year into gn
           select new {
            Count = from a in gn
                 group a by a.CreateDate.DayOfYear into aa
                 select new { Count = aa.Count(), Key = new DateTime(gn.Key , 1, 1).AddDays(aa.Key) }
           };

(извините за имена переменных: P)

0 голосов
/ 27 марта 2009

Используйте DateTime.Date, DateTime.Month и DateTime.Year. Однако в LINQ-to-SQL есть ошибка, которая иногда переводит их в недопустимый SQL. В качестве обходного пути вы можете сгруппировать по SqlMethods.DateDiffDay, SqlMethods.DateDiffMonth и SqlMethods.DateDiffYear, скажем, 1980-01-01.

Неделя не так проста. Начало недели зависит от настроек Sql Server, поэтому оно ненадежно. В качестве альтернативы вы можете использовать SqlMethods.DateDiffDay с некоторой даты, с которой начинается неделя в вашем случае, и разделить разницу в днях на 7. Если вам нужен номер недели в данном году, вам следует рассчитать разницу в днях с самого последнего дня начала недели, который меньше или равняется началу года.

0 голосов
/ 27 марта 2009

Я не знаю, как это сделать с помощью выражения LINQ, но вы можете написать хранимую процедуру, используя оператор PIVOT. См. Использование PIVOT и UNPIVOT .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...