请给Linq2Sql帮忙一些小组

时间:2009-03-26 23:43:17

标签: linq-to-sql

我需要显示我们按日,周,月和年销售的所有Products的历史记录。此数据将发送到Google图表API,以显示结果的折线图。

所以,如果我有一个名为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

Graph3(月份与销售次数)

Dec 08: 102
Jan 09: 23

我不确定“白天”是否可以完成......或者其中任何一个。

欢呼:)

更新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 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:0)

我不知道如何使用LINQ表达式,但您可以使用PIVOT运算符编写存储过程。请参阅Using PIVOT and UNPIVOT

答案 2 :(得分:0)

使用DateTime.Date,DateTime.Month和DateTime.Year。但是,LINQ-to-SQL中存在一个错误,有时会将这些错误转换为无效的SQL。作为一种解决方法,您可以按照'1980-01-01'中的SqlMethods.DateDiffDay,SqlMethods.DateDiffMonth和SqlMethods.DateDiffYear进行分组。

周部分并不那么容易。一周的开始取决于Sql Server设置,因此它不可靠。或者,您可以使用SqlMethods.DateDiffDay从您的案例中开始一周的某个日期开始,并将日差除以7.如果您需要给定年份的周数,则应计算与最近一周开始日相比较少的日期差异或等于年初。