2017-11-28 7 views
0
난 데이터 테이블 filterd 한 한

에 System.Data.EnumerableRowCollection를 변환 : C#을 Linq를 사용 DataTable을

result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values)); 

제가 또한

result.CopyToDataTable() 
같은 CopyToDataTable 방법을 이용하여 시도

result.CopyToDataTable<DataRow>() 

하지만 그들은 작동하지 않았다. result을 새 DataTable로 변환하려면 어떻게해야합니까? 많은 스택 오버플로 질문 및 기타 많은 자습서를 검색했지만 원하는 것을 찾을 수 없습니다. 내가 쉼표로 구분 된 값으로 HashSet에 연결된 한

UPDATE, 나는 내가 문자열 또는 HashSet의 배열을 사용한다고 생각?

+1

왜 새 DataTable로 사용 하시겠습니까? 당신이 아마 최선의 접근 방식을 취하지 않는 것처럼 들린다. 그리고 필터링을하기 전에 전체 테이블을 메모리에 다운로드하기 때문에'AsEnumerable(). Where '를 호출하지 않는 것이 좋습니다. –

답변

3

DataTable의 개체를 만들고 그 안에 문제가 해결 될 ImportRow() 함수를 호출하여 행을 가져 오는 것이 좋습니다.

DataTable.ImportRow Method

예제 코드.

DataTable tblClone = datTab.Clone(); 
foreach (DataRow datRow in datTab.Rows) 
{ 

     tblClone.ImportRow(datRow); 
} 

는 것이

var result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values)); 
DataTable tblClone = myDataTable.Clone(); 
foreach(DataRow dr in result) 
    tblClone.ImportRow(dr); 
+0

나는 대답과 그 작업을 시도했다 –

1

.CopyToDataTable<DataRow>()는 DataTable의를 반환처럼 당신이 그것을 다시 지정하지 않는 한,이 변수를 수정하지 않습니다 것입니다.

result = myDataTable.AsEnumerable().Where(row => row.Field<string>("id").Contains(values)); 

그런 다음 실제로는 DataTable 개체가 필요합니다.

DataTable resultDT = result.CopyToDataTable<DataRow>();

편집은 : 팀이 지적한 바와 같이 행이 쿼리에 의해 반환되지 않은 경우, 예외가 "The source contains no DataRows"

당신과 같이 뭔가를 할 수을 발생합니다;

DataTable resultDT = result.Any() ? result.CopyToDataTable<DataRow>() : myDataTable.Clone();

그러나 두 번 쿼리를 실행합니다 (팀은 지적으로도).

따라서 (.ToList())을 사용하여 목록 개체로 변환하고 개수를 확인한 다음 처리하십시오. 그것은 당신이 객체 (List 객체)의 새로운 인스턴스를 생성하는 것과 같은 성능에 영향을 미칩니다.

try/catch으로 변환하면 DataTable으로 변환하는 것도 좋지 않습니다. 최종 결과를 얻는 또 다른 좋은 방법은 Pranays 대답을 참조하십시오.

+0

당신은 또한 행이 술어와 일치하지 않는다면 예외를 던진다는 것을 기억해야한다. (그래서 ID에 값이 들어있는 행이 없다. , 이상한 쿼리). 당신은'if (result.Any()) ... '를 사용할 수 있습니다. 하지만 쿼리가 두 번 실행됩니다. 내가 선호하는'DataTable resultDT = myDataTable.Clone(); ... foreach (var r 결과) resultDT.ImportRow (r);' –

+0

@TimSchmelter 그것을 지적 해 주셔서 감사합니다. 그것을 추가 할 것입니다. – Adriani6

+0

@ Adriani6 나는 그것을 시도했다. 그러나 그것은 오류를 준다. –