2009-08-04 5 views
1

내가이 형식의 DataTable에있어 말을 부모 롤업으로, 그룹에 합류 내가하고 싶은 것을LINQ는

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

첫 번째의 net "data1"에 두 번째 테이블의 "data"필드가 추가되고 "id2"수준에서 데이터가 집계됩니다. 나는 이것을 어떻게하는지 알아 냈다. 그러나 내가 갇혀있는 것은 이것이다 : 나는 "parentID"를 가진 것을위한 데이터를 원한다! = -1이 그것의 부모에 추가된다. 위의 데이터의 출력은

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

이 있어야 효율적인 방법 일 수 있습니까?

편집 : 코드 샘플 재귀에 잘 적합하지 불행하게도, (확장자로하고, LINQ) SQL은

 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

왜 당신이이 경우에 그냥 한 단계, 당신이 이미 가지고 코드 ... –

답변

0

. parentID 열이 여러 레벨로 깊게 갈 수 있습니까? 이처럼 : 당신은 ID 10 ID 40 단계를 재 추적하려면

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

, 당신은 SQL/LINQ의 접근 방식을 포기해야 그냥 코드에서 그것을 할.

+0

아니 게시하지 않습니다. – toasteroven

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

나는 당신이 가고있는 것의 뒤에있는 논리를 보았다고 생각합니다. 나는 그것을 시도 할 것입니다. 쪽지에, 내가 원하는 것을 얻을 수있는 한 가지 방법은 두 번째 DataTable에 동일한 "parentID"열을 추가하고 "id"! = -1 인 경우 "parentID"에 그룹화하여 조인하는 것입니다. 내가 원했던만큼 우아한 것은 아니지만 작동한다. – toasteroven