linq 쿼리에 사용 된 TAKE 키워드는 해당 linq 쿼리의 실행을 평가할 때 누락 시키거나 또는 어떤 방법으로 누전을 유발합니까?.NET의 LINQ 키워드 'TAKE'가 단락 되었습니까?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
linq 쿼리에 사용 된 TAKE 키워드는 해당 linq 쿼리의 실행을 평가할 때 누락 시키거나 또는 어떤 방법으로 누전을 유발합니까?.NET의 LINQ 키워드 'TAKE'가 단락 되었습니까?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
둘 다. Take는 첫 번째 레코드 만 가져오고 그 다음 any는 일치하는 레코드를 찾자 마자 단락합니다 (단, 테이크로 인해 최대 1 개가 있음). Take 1을 안전하게 제거하고 동일한 성능을 유지할 수 있습니다.
이라는 단락 회로은 약 이기 때문에 여기서는 실제로 적용되지 않습니다. 몇 가지 예 (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 문을 추가하면이 작업을 쉽게 수행 할 수 있습니다.
근본적인 질문은 성능 측면에서 중요한 것인가? 음, 두 번의 반복 (상단) 대 하나, 미세 최적화를 방지하려고합니다.
둘 다. Take는 첫 번째 레코드 만 가져오고 그 다음 any는 일치하는 레코드를 찾자 마자 단락합니다 (단, 테이크로 인해 최대 1 개가 있음). Take 1을 안전하게 제거하고 동일한 성능을 유지할 수 있습니다. –
끝내 주셔서 감사합니다. –
@RobertMcKee 그 대답은 코멘트가 아니어야합니다 ... –