是否可以选择列的总和,按另一列分组?

时间:2012-07-02 13:06:50

标签: c# .net linq linq-to-sql sum

表格式:

Date   |   NumberIWantToSum   |   ID(PK)   |   ForeignKeyID

对于给定的ForeignKeyID,我想要使用Linq2SQL对所有具有相同日期的NumberIWantToSum值求和,然后使用该行中的所有值填充我自己的自定义类的列表。

这可能吗?

所以,给定值:

    Date   |   NumberIWantToSum   |   ID(PK)   |   ForeignKeyID
   1/1/1             1                  123              2
   1/1/1             12                 124              2
   1/1/1             44                 125              3
   1/1/2             14                 126              2

我给这个方法的ForeignKeyID参数,我们假设它是2,所以这个方法应该返回行:

   1/1/1             13                 123              2
   1/1/2             14                 126              2

我尝试这样做:

(from o in context.table.Where(r => r.GroupByThisColID == GroupByThisColID)
 select new CustomClass()
 {
     ID = o.ID,
     Date = o.Date,
     NumberIWantToSum = o.NumberIWantToSum,
     ForeignKeyID  = o.ForeignKeyID
 }).ToList();

但是,这并不是对NumberIWantToSum的值求和,而是将它们组合成一行。

我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

根据您的说明GroupByThisColdID用于过滤,而不是分组。你实际上想按日期分组。

试试这个:

var query = from o in context.table
            where o.GroupByThisColID == GroupByThisColID
            group o by o.Date into grouping
            select new CustomClass()
            {
                ID = grouping.First().ID,
                Date = grouping.Key,
                SummedNumbers = grouping.Sum(g => g.NumberIWantToSum),
                GroupByThisColID  = grouping.First().GroupByThisColID
            };

使用grouping.First().ID将返回第一个ID,尽管它们可能不同。这将是您的样本数据中的“123”。

答案 1 :(得分:2)

var r = from x in table
        group x by x.GroupByThisColID into g
        select new
        {
            Key = g.Key,
            Sum = g.Sum(i => i.NumberIWantToSum)
        };

foreach (var x in r)
{
    var key = x.Key;
    var sum = x.Sum;
}

答案 2 :(得分:2)

var results = context.table.GroupBy( t=> t.GroupByThisColID)
    .Select( g => new CustomClass()
        {
            GroupByThisColID = g.Key,
            ColumnSum = g.Sum( p => p.NumberIWantToSum)
        });