Creating datatables

本文关键字:datatables Creating | 更新日期: 2023-09-27 18:04:22

我有一个数据表[有5列]从db已合并的数据。我需要在这个组合表上调用一个组,并创建2个表…一个有groupedBy行,另一个有项。在c#代码中最快的方法是什么?此外,我还编写了下面的代码来为这两个表添加列。对吗?

下面是我的代码:

string colName = "ACCOUNT_ID"; 
var allRows = combinedTable.AsEnumerable();      
var accountRowGroups = allRows.GroupBy(row => row[colName]);
DataTable masterDataTable = new DataTable(); 
DataTable childPricesDataTable = new DataTable();
// Create the columns 
            DataColumnCollection pdCols = combinedTable.Columns; 
            for (int ndx = 0; ndx < pdCols.Count; ndx++) 
            { 
                string columnName = pdCols[ndx].ColumnName; 
                Type type = Type.GetType(pdCols[ndx].DataType.ToString());
                masterDataTable.Columns.Add(columnName, type); 
                childPricesDataTable.Columns.Add(columnName, type);
            }

Creating datatables

在这里看到一个类似的问题:如何合并多个DataTable对象与group by与c#和连接重复行?

我同意duffymo,在SQL中做,而不是在内存中的数据。

但是如果没有这个选项:

您可以添加两个datatable之间的关系:http://msdn.microsoft.com/en-us/library/ay82azad(v=vs.71).aspx

然后可以在组合的数据表上运行group by: http://codecorner.galanter.net/2009/04/20/group-by-and-aggregates-in-net-datatable/

下面是一个来自SQL团队的合适的例子:http://weblogs.sqlteam.com/davidm/archive/2004/05/20/1351.aspx
public static DataTable GROUPBY(DataTable Table, DataColumn[] Grouping, string[] AggregateExpressions, string[] ExpressionNames, Type[] Types)
        {
            if (Table.Rows.Count == 0)
                return Table;
            DataTable table = SQLOps.PROJECT(Table, Grouping);
            table.TableName = "GROUPBY";

            for (int i = 0; i < ExpressionNames.Length; i++)
            {
                table.Columns.Add(ExpressionNames[i], Types[i]);
            }

            foreach (DataRow row in table.Rows)
            {
                string filter = string.Empty;

                for (int i = 0; i < Grouping.Length; i++)
                {
                    //Determine Data Type        
                    string columnname = Grouping[i].ColumnName;
                    object o = row[columnname];
                    if (o is string || DBNull.Value == o)
                    {
                        filter += columnname + "='" + o.ToString() + "' AND ";
                    }
                    else if (o is DateTime)
                    {
                        filter += columnname + "=#" + ((DateTime)o).ToLongDateString()
                              + " " + ((DateTime)o).ToLongTimeString() + "# AND ";
                    }
                    else
                        filter += columnname + "=" + o.ToString() + " AND ";
                }
                filter = filter.Substring(0, filter.Length - 5);

                for (int i = 0; i < AggregateExpressions.Length; i++)
                {
                    object computed = Table.Compute(AggregateExpressions[i], filter);
                    row[ExpressionNames[i]] = computed;
                }
            }
            return table;
        }

这不是对你问题的直接回答,但可能是另一种(我相信更好的)解决你问题的方法。

如果我理解正确,你有数据表,一些定义的操作/过滤器,并希望返回修改的数据表作为结果。但在实践中,结果DataTable没有已知的形状(它可能会根据过滤器中的列而有所不同)。

考虑使用linq而不是操作数据表和数据关系。Linq支持你提到的所有操作:分组、过滤、修剪等等。

作为结果,你可以返回对象,这也是可绑定的,所以你可以在你的网格中使用它,但方法的定义将更加清晰。