2016-12-01 3 views
0

linq 쿼리에 사용 된 TAKE 키워드는 해당 linq 쿼리의 실행을 평가할 때 누락 시키거나 또는 어떤 방법으로 누전을 유발합니까?.NET의 LINQ 키워드 'TAKE'가 단락 되었습니까?

value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any 
+1

둘 다. Take는 첫 번째 레코드 만 가져오고 그 다음 any는 일치하는 레코드를 찾자 마자 단락합니다 (단, 테이크로 인해 최대 1 개가 있음). Take 1을 안전하게 제거하고 동일한 성능을 유지할 수 있습니다. –

+0

끝내 주셔서 감사합니다. –

+0

@RobertMcKee 그 대답은 코멘트가 아니어야합니다 ... –

답변

1

둘 다. Take는 첫 번째 레코드 만 가져오고 그 다음 any는 일치하는 레코드를 찾자 마자 단락합니다 (단, 테이크로 인해 최대 1 개가 있음). Take 1을 안전하게 제거하고 동일한 성능을 유지할 수 있습니다.

0

이라는 단락 회로은 약 이기 때문에 여기서는 실제로 적용되지 않습니다. 몇 가지 예 (here)를 참조하십시오. Take이 부울을 반환하지 않으므로 적용되지 않습니다.

아마도 다음과 같은 메시지가 표시됩니다. Any이 줄을 섰다면 Take이 실행됩니까? 논리적으로는 Any도 실행하면 을 건너 뛸 수 있습니다. Any도 첫 번째 일치 항목을 찾은 후에 중지하기 때문입니다.

그러나, 우리는 단지 연속적으로 불리는 확장 방법, 몇보고있다 :이 경우 Any에, 다음에 올 일이 어떤 방법 다음

value = MyDataTable.AsEnumerable() _ 
     .Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _ 
     .(Take(1)) _ 
     .Any() 

그래서 Take 실행하고 있습니다. Take을 실행해야 할 필요가 없다는 것을 어떻게 알 수 있습니까? source code에서 자신의 확장 메소드를 빌드하고 trace 문을 추가하면이 작업을 쉽게 수행 할 수 있습니다.

근본적인 질문은 성능 측면에서 중요한 것인가? 음, 두 번의 반복 (상단) 대 하나, 미세 최적화를 방지하려고합니다.

관련 문제