多组数据

时间:2011-02-08 12:38:20

标签: linq

我的Payment

中有一组数据如下
DateIssue             | Amount | CoursePaidForMonth | 
  2/3/2011 9:54:07 PM | 2000.00|          2
 2/27/2011 2:22:58 PM |   80.00|          2
 3/5/2011 11:14:56 PM |   80.00|          3
 3/27/2011 2:22:58 PM |   80.00|          2
 2/8/2011 6:32:45 PM  |   80.00|          2

我想为上面的数据执行两组分组:

  1. 截止日期是每月27日,所以我想将下个月27日至26日的所有数据分组到一个组中。这是从gName成功完成的。没问题 !!检查输出如下图所示。

    DateIssue             AppendCommToMonthΞΞ CoursePaidForMonthΞΞ TotalAmountΞΞ 
    2/8/2011 6:32:45 PM            2                    2             2080.00
    2/27/2011 2:22:58 PM           3                    2              160.00
    3/27/2011 2:22:58 PM           4                    2               80.00
    
  2. 现在我想对同一个查询执行另一个分组。我想将CoursePaidForMonth分组。意思是说,最终输出应该显示4行记录而不是3行,它从本月的27个到下个月的26个分组到一个组中,也由CoursePaidForMonth分组。怎么做?

    DateIssue             AppendCommToMonthΞΞ CoursePaidForMonthΞΞ TotalAmountΞΞ 
    2/8/2011 6:32:45 PM            2                    2             2080.00
    2/27/2011 2:22:58 PM           3                    2              80.00
    3/5/2011 11:14:56 PM           3                    3              80.00
    3/27/2011 2:22:58 PM           4                    2              80.00
    
  3. 我的代码在这里:

    var result = from p in db.Payments
                   join soi in db.SaleOrderItems on p.ReferenceId equals soi.Id
                   join ct in db.CourseByTutors on soi.InventoryOrCourseId equals ct.CourseId                              
                   where p.PayType == (int)PayTypes.PayCourseFee
                   && ct.TutorId == tutorId
                   let gName = (p.DateIssue.Value.Day < 27) ? (p.DateIssue.Value.Month) : (p.DateIssue.Value.Month % 12 + 1)
                   group p by new { gName} into g
                   select new
                   {
                      DateIssue = g.Select(x => x.DateIssue).First(),
                      AppendCommForWhichMonth = g.Key.gName,
                      CoursePaidForMonth = g.Select(x => x.CoursePaidForMonth).First(),
                                     TotalAmount = g.Sum(x => x.Amount),
                   };
    

    请建议..

1 个答案:

答案 0 :(得分:1)

您需要在密钥中加入CoursePaidForMonth。像这样:

var query = from p in db.Payments
            join soi in db.SaleOrderItems
                on p.ReferenceId equals soi.Id
            join cbt in db.CourseByTutors
                on soi.InventoryOrCourseId equals cbt.CourseId
            where p.PayType == (int)PayTypes.PayCourseFee && cbt.TutorId == tutorId
            orderby p.DateIssue
            let AppendCommForWhichMonth = p.DateIssue.Month + p.DateIssue.Day < 27 ? 0 : 1
            group p
                by new { AppendCommForWhichMonth, p.CoursePaidForMonth }
                into g
            select new
            {
                g.First().DateIssue,
                g.Key.AppendCommForWhichMonth,
                g.Key.CoursePaidForMonth,
                TotalAmount = g.Sum(p => p.Amount),
            };