【问题标题】:Creating datatables创建数据表
【发布时间】:2011-08-01 13:18:21
【问题描述】:

我有一个来自 db 的 DataTable[有 5 列],其中包含组合数据。 我需要在这个组合表上调用 group by 并创建 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);

            }

【问题讨论】:

    标签: c# .net linq datatable


    【解决方案1】:

    在此处查看类似问题:How to merge multiple DataTable objects with group by with C# and concatinating duplicate rows?

    我同意 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;
    
            }
    

    【讨论】:

    • 感谢 jeremy 的输入。想提一下,我已经使用 DataRelation 对象来绑定 2 个表 [即。 masterDataTable 和 childPricesDataTable] 到基础网格,但整个过程非常慢。因此我在 C# 中寻找另一种更快的方法。另外,当你说我可以使用 sql 时,你的意思是我应该从我的 sql 中返回 2 个表而不是超过 1 个组合表,然后使用 DataRelation 对象在网格中显示它们?
    • 另外,@duffymo 谈到在 sql 中组合 2 个表并返回所需的内容......如果我需要使用 sql,那么正如您在我上面的评论中看到的那样,我将不得不发送 2表 [master & child] 而不是 1,然后使用 DataRelation 对象在网格中显示它们......你还会建议我使用 sql 吗?
    • 嗨@Jimmy,因为你必须绑定两个网格“一个具有groupedBy行,另一个具有项目” - 我将创建一个存储过程并返回两个SELECT,一个Group By,另一个没有group by .然后,我将使用此处描述的 DataReader.NextResult() 方法“使用 NextResult 检索多个结果集”msdn.microsoft.com/en-us/library/haa3afyz.aspx 将两个网格绑定到数据库中。当在 SQL 中执行 JOIN 操作时,整个事情会快得多,尤其是当您的数据库增长时。 HTH
    【解决方案2】:

    这不是对您问题的直接回答,但可能是解决您问题的替代方法(我相信更好)。

    如果我理解正确,您有 DataTable、一些定义的操作/过滤器并希望返回修改后的 DataTable 作为结果。但在实践中,结果 DataTable 的形状未知(它可能因过滤器中的列而异)。

    考虑使用 linq 而不是操作 DataTables 和 DataRelations。 Linq 支持您提到的所有操作:分组、过滤、修剪等等。

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

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2020-02-04
      • 2011-07-11
      • 2012-08-15
      • 2019-03-17
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多