使用LINQ to SQL组,汇总和聚合在一起

时间:2010-08-18 17:27:25

标签: c# vb.net linq linq-to-sql aggregate-functions

我有两张桌子学生和折纸。折纸有学生外键表。每个学生每个月可以制作一个或多个折纸。

学生样本数据:

StudentId,FirstName,LastName

  • 187,John,Maslow
  • 196,Crystal,Hood
  • 195,Sarah,Lewis

折纸样本数据:

OrigamiId,StudentId,CreationDate,NumberOfOrigami

  • 1,187,5 / 17/2010 1:06:55 PM,1
  • 2,196,5 / 22/2010 1:31:28 PM,2
  • 3,187,6 / 18/2010 1:51:40 PM,2
  • 4,187,6 / 19/2010 2:13:35 PM,1
  • 5,196,7 / 17/2010 2:19:44 PM,3
  • 6,196,7 / 19/2010 2:23:02 PM,2
  • 7,195,7 / 20/2010 3:04:15 PM,3

以及更多类似该格式的记录。

我想每月给每个学生的折纸总数。看起来如下的东西:

  • 姓名,2010年1月,2010年2月等等
  • John Maslow,2,3,
  • Crystal Hood,4,5
  • Sarah Lewis,6,5

感谢。

  

更新一个

    Dim query = From st In db.Students _
                 Join or In db.Origami On or.StudentId Equals st.StudentId _
                 Group By or.StudentId Into TotalOrigami = Sum(or.NumberOfOrigami) _
                 Select StudentId, TotalOrigami

此查询仅提供每个学生的总折纸。但我希望每个学生每月计算折纸。任何建议都是欢迎的。

2 个答案:

答案 0 :(得分:0)

可以创建一个仅在origami对象上保存Month / Year的额外属性。然后使用下面的查询

            var q = from st in db.Students 
                    join or in db.Origami on or.StudentId equals st.StudentID
                    group st by new { st.StudentId, or.MonthYear } into g
                    select new { g.Key.StudentId, g.Key.MontYear, Total = g.Count() };

我刚看到这个例子是在C#中,但我希望你能通过。

答案 1 :(得分:0)

这是有效的查询:

Dim query = From st In db.Students _ 
                 Join ori In db.Origami On ori.StudentId Equals st.StudentId _ 
                 Group By key = New With {ori.Student, .MonthYear = (ori.CreationDate.Value.Month & "/" & tr.CreationDate.Value.Year)}  Into TotalOrigami = Sum(ori.NumberOfOrigami) _ 
                 Select key.Student.FirstName,key.Student.LastName,key.MonthYear,TotalOrigami