2013-08-27 2 views
2

일부 레코드가로드 된 데이터 테이블이 있고 다른 파일에서 쿼리를 가져 와서이 쿼리에서 가져 오는 ID가 데이터 테이블에 있는지 확인하려고합니다.DataTable에서 LINQ의 .Any() 사용

foreach (var item in records) 
{ 
    bool hasit = dt.AsEnumerable().Any(p => p.Field<string>(0) == item.ID); 
    if (!hasit) 
    { 
     //Logic 
    } 
} 

내가 그 .ANY() 함수를 사용하여 기록 컬렉션의 ID를 일치하는 데이터 테이블의 첫 번째 필드에 ID가있는 경우는 true를 반환 할 것으로 예상하고있다. 그것은 계속해서 거짓을 반환하지만, 나는 무엇인가 놓치고 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 모든 요소가 발견되면

+0

는 dt.AsEnumerable'의 결과로 빈 열거를 설정하십시오(). 어떤 사람 (p => p.Field (0) == item.ID); 그리고 당신이 무엇을 돌려 주는지 봅니다. – bendataclear

+4

은'! hasit'을'hasit'으로 변경할 수 있습니까? –

+0

'records' 컬렉션에있는 많은 수의 아이템에 대해서는 비효율적입니다. "레코드 컬렉션"형식 쿼리의 "ID"열 목록에 필드 0이 들어있는 위치를 사용하도록이 코드를 다시 작성할 수 있습니까? – asawyer

답변

1

있어서 .ANY (p => p.Field (0) == item.ID)

사실 반환한다. 귀하가 게시 한 코드는 귀하가 다음에 할 일은 부정확 한 행동을 일으키는 경우 (어떤 것이 있는지)를 묻는 것입니다. 변경 :

if (hasit) 
{ 
    //Logic 
} 

그리고 원하는 결과를 얻을 수 있습니다.

편집 : 명성 Cuong Le for the observation.

+1

요소가있는 경우 무언가를하기를 원한다고 가정하면 요소가 없으면 논리를 실행하려고 할 수 있습니다. – bendataclear

+1

그래, 나는 네가 의미하는 것을 보지만 네가 맞다면 나는 논리를하고 싶다. – KJ3

-1

에 내가 오류를 찾을 수 있는지 확인하기 위해 그것을 나눈 것 :

foreach (var item in records) 
{ 
    var enumer = dt.AsEnumerable(); // <-- Check this to make sure it has elements 
    var filtered = enumer.Any(p => p.Field<string>(0) == item.ID); // <- Check to make sure it has elements 

}