C# 是否可以选择一列的和,按另一列分组?
表格格式:C# 是否可以选择一列的和,按另一列分组?,c#,.net,linq,linq-to-sql,sum,C#,.net,Linq,Linq To Sql,Sum,表格格式: Date | NumberIWantToSum | ID(PK) | ForeignKeyID 对于给定的ForeignKeyID,我希望使用Linq2SQL对具有相同日期的所有NumberWantToSum值求和,然后用行中的所有值填充我自己的自定义类的列表 这可能吗 因此,考虑到这些值: Date | NumberIWantToSum | ID(PK) | ForeignKeyID 1/1/1
Date | NumberIWantToSum | ID(PK) | ForeignKeyID
对于给定的ForeignKeyID,我希望使用Linq2SQL对具有相同日期的所有NumberWantToSum值求和,然后用行中的所有值填充我自己的自定义类的列表
这可能吗
因此,考虑到这些值:
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的值相加并将它们合并到一行中
我该怎么做呢?根据您的解释,
GroupByThisColdID
用于筛选,而不是分组。实际上,您希望按日期分组
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;
}
试试这个:
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”。ID字段-它包含在预期结果中,但不包含在group by(或MIN/MAX/etc)中。那么它怎么知道选择123而不是124呢?这里缺少了一些东西…?也许我缺少了一些东西,但是一个2的组不应该产生1+12+14吗?我也不知道如何处理这个问题;为该列返回哪个并不重要(因为两者都是唯一的)。关于如何处理这个问题有什么建议吗?@JustinPihony-没有,因为44人的groupbythiscold是3,而其余的人只有2。我只希望返回GroupByThisColID为2的值(或者传入的参数是什么)。我不是LINQ方面的专家,但在TSQL中,您的2是where参数,日期是GROUPBY列。但是,您必须告诉它如何处理ID字段,否则它将为这里的每个唯一值返回一行,所以这不会求和。
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
};