2009-08-04 30 views
1

说我有这种格式的DataTable:LINQ加入,合并,与父母卷起

id | key1 | key2 | data1 | data2 | parentID 
10 | AA | one | 10.3 | 0.3 | -1 
10 | AA | two | 20.1 | 16.2 | -1 
10 | BB | one | -5.9 | 30.1 | -1 
20 | AA | one | 403.1 | -20.4 | 10 
30 | AA | one | 121.5 | 210.3 | -1 

和第二数据表,如下所示:

id | data 
10 | 5500 
20 | -3000 
30 | 500 

我想要做的将数据集中在“id”级别,将第二个表的“data”字段添加到第一个“data1”网络中,然后将“data2”加入其自身。我想出了如何做到这一点,但我坚持的是这样的:我想要将“parentID”!= -1的任何数据添加到它的父项中。因此,上述数据的输出应该

id | data1 | data2 
10 | 2927.6 | 26.2 
30 | 621.5 | 210.3 

是有一个有效的方式来做到这一点?

编辑:代码示例

 DataTable dt1 = new DataTable(); 
     dt1.Columns.Add("id", typeof(int)); 
     dt1.Columns.Add("key1", typeof(string)); 
     dt1.Columns.Add("key2", typeof(string)); 
     dt1.Columns.Add("data1", typeof(double)); 
     dt1.Columns.Add("data2", typeof(double)); 
     dt1.Columns.Add("parentID", typeof(int)); 

     DataTable dt2 = new DataTable(); 
     dt2.Columns.Add("id", typeof(int)); 
     dt2.Columns.Add("data", typeof(double)); 

     dt1.Rows.Add(new object[] { 10, "AA", "one", 10.3, 0.3, -1 }); 
     dt1.Rows.Add(new object[] { 10, "AA", "two", 20.1, 16.2, -1 }); 
     dt1.Rows.Add(new object[] { 10, "BB", "one", -5.9, 30.1, -1 }); 
     dt1.Rows.Add(new object[] { 20, "AA", "one", 403.1, -20.4, 10 }); 
     dt1.Rows.Add(new object[] { 30, "AA", "one", 121.5, 210.3, -1 }); 

     dt2.Rows.Add(new object[] { 10, 5500 }); 
     dt2.Rows.Add(new object[] { 20, -3000 }); 
     dt2.Rows.Add(new object[] { 30, 500 }); 

     var groups = dt1.AsEnumerable() 
         .GroupBy(e => e["id"]) 
         .Select(e => new 
            { 
             id = e.Key, 
             net_data1 = e.Sum(w => (double)w["data1"]), 
             net_data2 = e.Sum(w => (double)w["data2"]) 
            }) 
         .GroupJoin(dt2.AsEnumerable(), e1 => e1.id, e2 => e2["id"], 
            (a1, a2) => new 
               { 
                id = a1.id, 
                net_data1 = a1.net_data1 + a2.Sum(w => (double)w["data"]), 
                net_data2 = a1.net_data2 
               }); 
+1

你为什么不张贴你有已有的代码... – 2009-08-04 15:23:23

回答

0

不幸的是,SQL(以及通过扩展,LINQ)不是非常适合于递归。 parentID列可以深入多层次吗?就像这样:

ID  Parent 
------------------ 
10  -1 
20  10 
30  10 
40  20 

如果您想从ID 40追溯的步骤达ID是10,那么你就应该放弃一个SQL/LINQ的做法,只是做在代码。

+0

没了,在这种情况下,它只是一个级别。 – toasteroven 2009-08-04 15:44:01

0

这听起来像是一个很好的使用组连接。这样的事情可能工作(虽然它是完全未经测试):

var items = from parent in context.dataTable 
      join child in context.dataTable on parent.id equals child.parentID into children 
      where parent.parentID == -1 
      select new { id = parent.id, 
         data1 = (parent.data1 + children.Sum(c => c.data1)), 
         data2 = (parent.data2 + children.Sum(c => c.data2)) }; 
+0

我想我明白你要做什么的逻辑,我会尝试一下。 在一个侧面说明,我设法得到我想要的一种方法是添加相同的“parentID”列到第二个DataTable,并且如果“id”!= -1,则按groupID加入“parentID”...没有我想要的那么优雅,但它有效。 – toasteroven 2009-08-04 16:08:10