具有相同ID

时间:2016-01-19 07:28:14

标签: c# datatable

例如

| ID | Amt |  
------------
|  A |  3  |
|  A |  2  |
|  B |  2  |  

结果

| ID | Amt |  
------------
|  A |  5  |
|  B |  2  |  

我目前的策略是在插入之前始终检查是否已存在相同的ID。只是想知道是否可以在此之后插入所有内容并加上相同的ID。

2 个答案:

答案 0 :(得分:0)

DataTable中没有任何AFAIK允许在将数据添加到DataTable时自动对具有相同键值(重复项)的行进行SUM运算(从而更改UPDATE操作中的INSERT操作)。

但是,在设置PrimaryKey属性并在Add操作之前执行搜索很简单之后。如果要增加DataTable对象中现有DataRow的字段值,则需要检索该行,然后递增其值。

例如,假设你有这种表:

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(System.String));
dt.Columns.Add("Amount", typeof(System.Int32));
dt.PrimaryKey = new DataColumn[] {dt.Columns["ID"]};

dt.Rows.Add("A", "10");
dt.Rows.Add("B", "20");

DataRow[] found = dt.Select("ID='A'");
if(found.Length == 1)
{
    int value = found[0].Field<int>("Amount");
    found[0].SetField("Amount", value + 10);
}

如果您已经有一个包含重复行的DataTable并且您希望按键列和Sum the Amount列对它们进行分组,则情况会更复杂。在这种情况下,我认为您需要构建一个新的DataTable,使用GroupBy扩展

创建所需的信息

(与之前相同,但当然没有PrimaryKey)

dt.Rows.Add("A", 10);
dt.Rows.Add("A", 20);
dt.Rows.Add("B", 20);

var result = dt.AsEnumerable()
       .GroupBy(x => x.Field<string>("ID"))
       .Select(g => new { ID = g.Key, Amount = g.Sum(z => z.Field<int>("Amount")) });

DataTable t2 = dt.Clone();
foreach (var grp in result)
    t2.Rows.Add(grp.ID, grp.Amount);

现在,T2表只包含非重复行,金额总和。当然,此时如果要添加现有行,仍需要第一种方法。

答案 1 :(得分:0)

使用此

    var result= (from a in table.AsEnumerable()
                 group a by new{id= a.Field<string>("ID")} into g
                  select new {
                      ID=g.Key.id,
                      Amt=g.Sum(x=>x.Field<int>("Amt"))
                    });

针对.net表进行了更新。