2011-03-11 6 views
3

두 테이블의 데이터 테이블은 동적이며 둘 다 공통 열을 가지고 있습니다. 이제이 두 테이블을 결합하고 싶습니다. 결합 결과.Linq를 사용하는 동적 데이터 테이블 합치기

미리 감사드립니다.

+0

에 유용 할 수 있습니다, 정확히 무엇을 의미합니까? 형식이없는'DataTable'입니까,'ExpandoObject' 또는'DynamicObject' 파생 인스턴스의 목록입니까, 아니면 전혀 다른 것입니까? – mmix

+0

실제로 저장 프로 시저는 두 테이블의 공통 열에 ID, Name이있는 두 개의 테이블을 반환합니다. 동일한 수의 열을 갖지만 열 이름은 다릅니다. 두 테이블을 모두 결합해야합니다. –

답변

0

간단한 방법은 테이블에서 AsEnumerable()을 사용하고 공통 열 데이터에서 조인하는 것입니다. [Table1] -> [ID] [Name] [Location] | [Table2] -> [ID] [Description] 및 ID 열이 같은 값 그리고


DataTable table1 = new DataTable(); 
table1.Columns.Add("ID", typeof(int)); 
table1.Columns.Add("Name", typeof(string)); 
table1.Columns.Add("Location", typeof(string)); 
table1.Rows.Add(1, "Name1", "Location1"); 
table1.Rows.Add(2, "Name2", "Location2"); 
table1.Rows.Add(3, "Name3", "Location3"); 

DataTable table2 = new DataTable(); 
table2.Columns.Add("ID", typeof(int)); 
table2.Columns.Add("Description", typeof(string)); 
table2.Rows.Add(1, "Description1"); 
table2.Rows.Add(2, "Description2"); 
table2.Rows.Add(3, "Description3"); 

그냥 ID 컬럼에 테이블을 조인하고 결과 데이터가

설정을 선택해야이 있습니다

의 당신의 테이블과 같이 있다고 가정하자


var joinedTables = from data1 in table1.AsEnumerable() 
        join data2 in table2.AsEnumerable() on data1.Field("ID") equals data2.Field("ID") 
        select new { id= data1.Field("ID"), 
        name = data1.Field("Name"), 
        loc = data1.Field("Location"), 
        desc = data2.Field("Description") 
        }; 

결과 데이터 :

id name loc  desc 
1 Name1 Location1 Description1 
2 Name2 Location2 Description2 
3 Name3 Location3 Description3 
+0

Acutally 모든 열이 필요합니다. 두 테이블 및 단 하나의 일반적인 컬럼에서. 선택 문에서 나는 특정 새로운 컬럼을 언급하고 싶지 않다. { –

0

그것은 어떤의 ExpandoObject을 사용하지 않고 LINQ가 일반적으로 컴파일 타임에 스키마를 알아야하는 강력한 형식의 개체를 생성하기 때문에 조정하기 쉽습니다. 내가 이런 일을 볼 수있는 방법이 SQL은, 그냥 제공 선택 정확히 같은 방법은 LINQ에서

public ExpandoObject CombineMe(DataRow r1, DataRow r2) 
{ 
    dynamic x = new ExpandoObject(); 
    x.ID = r1.Field<int>("ID"); 
    x.Name = r1.Field<string>("Name"); 

    // use Expando as dictionary 
    IDictionary<String, Object> xd = (IDictionary<String, Object>)x; 

    // enumerat both rows for all columns not ID and Name and add to Expando 
    foreach (DataColumn c in r1.Table.Columns) 
     if (c.ColumnName != "ID" && c.ColumnName != "Name") 
      xd.Add(c.ColumnName, r1[c]); 
    foreach (DataColumn c in r2.Table.Columns) 
     if (c.ColumnName != "ID" && c.ColumnName != "Name") 
      xd.Add(c.ColumnName, r2[c]); 
    return x; 
} 

/// .... further down 

var p = from a in table1.AsEnumerable() 
     join b in table2.AsEnumerable() on a.Field<int>("ID") equals b.Field<int>("ID") 
     select CombineMe(a, b); 

선택 발견 된 모든 필드의 조합으로 동적 객체를 생성합니다 변환을 통해 호출되는 방법을 결합을 통해되지이다 변환을위한 자리 표시 자 (placeholder)는 단순하거나 복잡하거나 심지어 외부 호출 코드 일 수도 있습니다.

참고 : 동적 사용을 원하지 않는 경우 먼저 두 테이블의 모든 열을 열거하고 세 번째 테이블을 만드는 방법으로 솔루션을 만들 수 있습니다. 그런 다음 CombineMe를 ExpandoObject 대신 DataRow으로 생성하고 마지막으로 p를 열거하고 모든 항목 (결합 된 인스턴스 DataRow)을 결과 테이블에 추가합니다.