두 테이블의 데이터 테이블은 동적이며 둘 다 공통 열을 가지고 있습니다. 이제이 두 테이블을 결합하고 싶습니다. 결합 결과.Linq를 사용하는 동적 데이터 테이블 합치기
미리 감사드립니다.
두 테이블의 데이터 테이블은 동적이며 둘 다 공통 열을 가지고 있습니다. 이제이 두 테이블을 결합하고 싶습니다. 결합 결과.Linq를 사용하는 동적 데이터 테이블 합치기
미리 감사드립니다.
안녕하세요. 런타임에 생성되는 두 개의 데이터 테이블을 조인 할 수 있습니다. 이 링크를 확인하십시오. 당신이 "동적 열 데이터 테이블"말할 때 당신
Finding common columns from two datatable and using those for Join condition in LINQ
감사합니다. 이것은 또한 나를 위해 일했습니다. –
간단한 방법은 테이블에서 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
Acutally 모든 열이 필요합니다. 두 테이블 및 단 하나의 일반적인 컬럼에서. 선택 문에서 나는 특정 새로운 컬럼을 언급하고 싶지 않다. { –
그것은 어떤의 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
)을 결과 테이블에 추가합니다.
에 유용 할 수 있습니다, 정확히 무엇을 의미합니까? 형식이없는'DataTable'입니까,'ExpandoObject' 또는'DynamicObject' 파생 인스턴스의 목록입니까, 아니면 전혀 다른 것입니까? – mmix
실제로 저장 프로 시저는 두 테이블의 공통 열에 ID, Name이있는 두 개의 테이블을 반환합니다. 동일한 수의 열을 갖지만 열 이름은 다릅니다. 두 테이블을 모두 결합해야합니다. –