【问题标题】:DataTable.Select() to display summation of records in datatableDataTable.Select() 显示数据表中记录的总和
【发布时间】:2018-11-02 10:07:29
【问题描述】:

在我的 C# 项目中的 DataTable 中,我需要对几列求和并显示聚合记录,但我无法为此创建过滤查询。

记录如下:

|Col1|Col2|Col3|Col4|  
| A  | X  | 10 | 10 |  
| A  | X  | 10 | 20 |  
| A  | Y  | 12 | 12 |  
| A  | Y  | 10 | 10 | 

结果将是:

|Col1|Col2|Col3|Col4|  
| A  | X  | 20 | 30 |  
| A  | Y  | 22 | 22 |  

我必须使用DataTable.Select("filter condition")

【问题讨论】:

  • DataTable.GroupBy(item => new {item.Col1, item.Col2}).Select(chunk => new {Col1 = chunk.Key.Col1, Col2 = chunk.Key.Col2, Col3 = chunk.Sum(item => item.Col3), Col4 = chunk.Sum(item => item.Col4)})
  • 当你必须使用不是 LINQ 的DataTable.Select 时为什么要标记 LINQ?
  • 类似this answer 的东西?使用Compute 而不是Select,但它是一个DT,没有LINQ。
  • @TimSchmelter:我可以使用 LinQ 作为一个遗留系统,我必须以最少的更改来优化这个应用程序。如果我的句子误解了我的意图,我们深表歉意。

标签: c# .net linq


【解决方案1】:
var result = (from DataRow s in yourDataTable.Select("filter conditions").AsEnumerable()
              group s by new {g1 = s.Field<string>("Col1"), g2 = s.Field<string>("Col2") } into g
              select new
              {
                  Col1 = g.Key.g1,
                  Col2 = g.Key.g2,
                  Col3 = g.sum(r => r.Field<decimal>("Col3")),
                  Col4 = g.sum(r => r.Field<decimal>("Col4")),
               }).ToList();

如果您希望结果为 DataTable 类型,您可以将列表转换为 DataTable,如下所示:

var resultAsDataTable = ConvertListToDataTable(result);

public static DataTable ConvertListToDataTable<T>(IList<T> data)
{
    PropertyDescriptorCollection props =
        TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new DataTable();
    for (int i = 0; i < props.Count; i++)
    {
        PropertyDescriptor prop = props[i];
        table.Columns.Add(prop.Name, prop.PropertyType);
    }
    object[] values = new object[props.Count];
    foreach (T item in data)
    {
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = props[i].GetValue(item);
        }
        table.Rows.Add(values);
    }
    return table;
}

【讨论】:

  • "我必须使用DataTable.Select("filter condition")" 听起来好像他不能使用LINQ
  • DataTable 可以使用 LINQ,您必须使用 AsEnumerable() 强制转换您的数据表,然后您可以对 IEnumerable 对象进行 linq 查询。
  • 是的,但是 OP 声明他必须使用DataTable.Select,这很奇怪,因为他还标记了 LINQ。似乎有人告诉他不要使用 LINQ,可能是因为他们不能使用它。
  • @HasanGholamali:感谢您的回答。您能否添加我如何在此结果中附加其他列并根据应用程序的规范更改列名。就像这张表有以下列:父代码(我的问题中的Col1),子代码(我的问题中的Col2),购买数量(Col3),购买价格(Col4)和另外6个列,例如-Sell Qty,Sell Price,Reason,日期、更新时间、消息。
  • @AshishJaiswal 只需替换名称,在选择中您可以使用所有可枚举的方法,例如 .ToList().FirstOrDefault() 我不知道您到底想要什么,如果您的专栏有问题编辑问题您想要的名称和结果。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2012-05-24
  • 2014-11-29
相关资源
最近更新 更多