Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择()以显示DataTable中记录的总和_C#_.net_Linq - Fatal编程技术网

C# 选择()以显示DataTable中记录的总和

C# 选择()以显示DataTable中记录的总和,c#,.net,linq,C#,.net,Linq,在我的DataTable中的C项目中,我需要对一些列求和并显示聚合记录,而我无法为此创建筛选器查询 记录如下: |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中的C项目中,我需要对一些列求和并显示聚合记录,而我无法为此创建筛选器查询

记录如下:

|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。选择筛选条件

若您想将结果转换为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.GroupByitem=>new{item.Col1,item.Col2}。Selectchunk=>new{Col1=chunk.Key.Col1,Col2=chunk.Key.Col2,Col3=chunk.Sumitem=>item.Col3,Col4=chunk.Sumitem=>item.Col4}为什么要在必须使用非LINQ时标记LINQ?类似于?使用Compute而不是Select,但它是DT,没有LINQ。@TimSchmelter:我可以使用LINQ,因为它是一个遗留系统,我必须以最小的更改优化此应用程序。如果我的句子误解了我的意图,我深表歉意。我必须使用DataTable。选择听起来好像他不能使用LINQDataTable的筛选条件可以使用LINQ,你必须使用AsEnumerable强制转换你的DataTable,然后你可以对IEnumerable对象进行LINQ查询。是,但OP声明他必须使用DataTable.Select,这很奇怪,因为他还标记了LINQ。好像有人告诉他避开LINQ,也许是因为他们不能使用它。@HasanGholamali:谢谢你的回答。您可以添加为吗?我如何在此结果中附加其他列,并根据应用程序的规范更改列名。类似此表有以下列:我的问题中的父CodeCol1,我的问题中的子CodeCol2,购买数量Col3,购买价格Col4和其他6列,如-出售数量,出售价格,原因,日期,更新时间,消息。@AshishJaiswal只需替换名称,在“选择”中,您可以使用所有可枚举方法,如.ToList和.FirstOrDefault。如果您对列名和所需结果有编辑问题,我不知道您到底想要什么。
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;
}