C# 分组依据,以LINQ求和

C# 分组依据,以LINQ求和,c#,linq,C#,Linq,假设我有下表: user type amount 2 a 10 2 b 20 2 c 40 3 a 15 3 b 20 3 c 45 我想用(c-(a+b))按用户和类型分组来替换(c)金额,我该怎么做?谢谢这里有一个方法: 更新(现在使用Sum): 我建议对Steven的答案进行扩展,因为这只会返回标量c值序列,而不会将它们与用户或a和b金额关联。试试这个: var query1 = from i in table

假设我有下表:

user type amount
2    a    10
2    b    20
2    c    40
3    a    15
3    b    20
3    c    45
我想用(c-(a+b))按用户和类型分组来替换(c)金额,我该怎么做?谢谢

这里有一个方法:

更新(现在使用
Sum
):


我建议对Steven的答案进行扩展,因为这只会返回标量
c
值序列,而不会将它们与用户或
a
b
金额关联。试试这个:

var query1 = from i in table
             group i by i.user
             into g
             let a = g.Where(t => t.type == "a").Sum(t => t.amount)
             let b = g.Where(t => t.type == "b").Sum(t => t.amount)
             let c = g.Where(t => t.type == "c").Sum(t => t.amount)
                   - (a + b)
             select new {user = g.Key, a, b, c};
然后,如果要将其转换回表格格式:

var query2 = query1.SelectMany(q => new List<TableType>
                                    {
                                        new TableType(q.user, "a", q.a),
                                        new TableType(q.user, "b", q.b),
                                        new TableType(q.user, "c", q.c)
                                    })
                                    .OrderBy(t => t.user)
                                    .ThenBy(t => t.type);
var query2=query1.SelectMany(q=>newlist
{
新的表格类型(q.user,“a”,q.a),
新的表格类型(q.user,“b”,q.b),
新的表格类型(q.user,“c”,q.c)
})
.OrderBy(t=>t.user)
.ThenBy(t=>t.type);

注意:我已经对此进行了测试,它可以正常工作。

在LINQ to SQL中,或者您是否已经在类型化集合中拥有数据(因此,LINQ to Objects)?我想您的意思是希望按用户值分组,因为用户和类型的所有组合都是唯一的?LINQ to SQL,这是一个GenRetated DataTable,我假设每种类型的每个用户可以有多个条目。我没有假设,因为OP没有指定这一点。在这种情况下,查询将不同(可能是一个
Sum
而不是
Single
)。他最近的评论支持我的假设,这很公平。更新了我的答案。
var query2 = query1.SelectMany(q => new List<TableType>
                                    {
                                        new TableType(q.user, "a", q.a),
                                        new TableType(q.user, "b", q.b),
                                        new TableType(q.user, "c", q.c)
                                    })
                                    .OrderBy(t => t.user)
                                    .ThenBy(t => t.type);