2012-02-22 5 views
1

작동하지 않음에 LINQ 쿼리 후 나는 SQL 서버 exectution에서 생성되는 데이터 테이블에서 실행되는 C#에서 LINQ 쿼리가 : 그 후foreach는 데이터 테이블이

DataTable dtSubjects = db.ExecuteDataTable(); 
      var subjectsWithoutParent = from row in dtSubjects.AsEnumerable() 
             where row["ParentID"] != DBNull.Value && row.Field<int>("ParentID") == 0 
             select row; 

를 각각 실행해야합니다 foreach는있다 DataRow가 LINQ에서 반환되었습니다. 그러나 foeach 코드는 실행되지 않습니다.

foreach (DataRow rowSubject in subjectsWithoutParent) 
      { 
       rowSubject["ParentID"] = DBNull.Value; 
      } 

DataTable에 그것에 행을 가지고 있으며, 지금까지 내가 말할 수있는 subjectsWithoutParent는 LINQ에서 적어도 하나 개의 행을 가져옵니다.

아이디어가 있으십니까?

+0

'실행되지 않음'이란 무엇입니까? ... 컴파일되지 않습니까, 예외가 생깁니 까 ... ?? 'subjectsWithoutParent' 시퀀스에 항목이 포함되어 있는지 확인 하시겠습니까? ** 및 **, 그리고 내가 말할 수있는만큼 subjectsLithoutParent는 LINQ에서 적어도 하나의 행을 가져옵니다. - 그냥'.Any()'를 사용하여 이것을 검증하십시오! –

+0

분명히해야합니다. 코드가 컴파일되지만 컴파일러는 foreach에 "들어갈 수 없으므로"subjectsWithoutParent에 행이 없다고 생각하지만 실행되지 않는 루프를 호출합니다. – jbkkd

+0

** 컴파일러는 생각하지 않습니다 ** (sic) 시퀀스의 항목에 대한 단서가 없다. 단지'.Any()'-call을 사용하여 명확히하라. –

답변

2

IEnumerable<DataRow> subjectsWithoutParent = (from row in 
dtSubjects.AsEnumerable()           
where row["ParentID"] != DBNull.Value && 
row.Field<int>("ParentID") == 0           
select row).ToList<DataRow>(); 

을 시도하고 subjectsWithoutParent.Any()는이 데이터를 검색되지 않았거나 확인?

+0

....'Count()'를 사용하지 말 것 ... 만일 .AsEnumerable()의 결과가'ICollection' 타입이 아니라면, 열거 자 (enumerator)는 실행될 것이고 마지막 요소 올바른 양을 얻으려면 - .Any()를 사용하십시오! –

+0

@AndreasNiedermair - 업데이트 된 정보를 주셔서 감사합니다 ... –

+0

이것은 LINQ 이전에 실행되는 SQL 쿼리에 문제가있어 LINQ 쿼리가 문제가되지 않는다는 것을 이해하는데 많은 도움이되었습니다. 그래도 나는 이것을 실제 문제를 발견하는 데 도움을 준 답으로 표시하고있다. – jbkkd

0

필터 조건으로 모든 행이 제거되지 않았습니까? (모든 행에 null이 아니고 0이 아닌 ParentID 값이있는 경우)? Linq 쿼리에서 where 행을 주석 처리하고 foreach에서 rowSubject 업데이트 행을 주석 처리하여이를 테스트 할 수 있습니다. 그런 다음 디버거로 치십시오.