2010-03-07 3 views
2

필자는 데이터를 Excel에서 빌드 한 Datable을 가지고 있지만 때로는 Excel이 모든 필드가 null 인 행을 반환합니다.linq을 사용하여 DataTable에서 null 행을 필터링하는 방법은 무엇입니까?

저는 이것을 컬럼 이름에 관계없이 일반적으로 필터링하고 싶습니다.

저는 Linq가이 작업을 훌륭하게 수행 할 것이라고 생각하지만 이런 일이 발생하는 데 어려움이 있습니다.

var nonemptyrows = from r in table.AsEnumerable() 
               from f in r.ItemArray 
                where f != null 
                select r; 

을하지만 그것은 아주가 아니다 :

지금까지이 내가 가진 것입니다. 아무도 내가 누락 된 부분을 보거나 내가 잘못된 길을 걷고있는 것을 본 적이 있습니까?

미리 감사드립니다. 쿼리 이해 구문을 사용하여

table.AsEnumerable() 
    .Where(r => r.ItemArray.Any(v => v != null && v != DBNull.Value)) 

을 또는 :

답변

4
이 같이

from r in table.AsEnumerable() 
where r.ItemArray.Any(v => v != null && v != DBNull.Value) 
+0

에만 단독 1 열은 열 번호 2와 같은 null이되지 않도록 널 수 없습니다되지 않습니다. 이제 내 코드는'IEnumerable refIds = (from dataTable.AsEnumerable() select dataRow.Field (dataColumn.ColumnName));'입니다. refIds.ToList()를 사용할 때 잘못된 캐스트 예외가 발생합니다. – Saravanan

+0

편집 : IEnumerable은 String 유형이고 Null 일 수 없으므로 고유 ID를 가져 오지 않을 수 있습니다. – Saravanan

3

비트 청소기, 테이블 열을 사용 : 답장을 보내

var nonemptyrows = from row in table.AsEnumerable() 
        where table.Columns.Any(col => !row.IsNull(col)) 
        select row; 
+0

더 빠를 것입니다. – SLaks

+0

일반적으로 table.OfType ()을 사용하여 DataTable을 수평 적으로 정렬하고 개체의 행을 DataRow로 캐스팅합니다. 그러나 행 중 하나가 null 인 경우 동작이 확실하지 않습니다. – Will

+0

DataTable에 Null 행을 사용할 수 없습니다. 그리고 DataTable의 항목은 항상 DataRow이므로 'OfType ()'이 필요하지 않으므로'() '을 캐스트 할 수 있습니다 (유형은 동일하지만 필터하지 않습니다) –

1

감사합니다! 내가 게시 된 직후,이 아이디어는 아래 나를 때리는 그리고 그것은 나를 위해 일한 :

var nonemptyrows = from r in table.Rows.Cast<DataRow>() where r.ItemArray.All(c => c != DBNull.Value) select r; 
관련 문제