2010-06-09 12 views
0

안녕하세요, 개체의 특성을 변경하려고합니다. 다른 테이블에 저장된 동일한 속성 값으로 설정 중입니다. 이 둘 사이에는 일대일 관계가 있습니다. 제품 끝은 하나이고 버전은 많습니다. 지금 당장 시도한이 두 메소드는 반환 된 모든 제품을 최종 버전 객체와 동일하게 설정했습니다. 그래서,이 경우 그들은 모두 같습니다. 문제가 어디에 있는지 나는 잘 모릅니다. 다음은 두 코드 스 니펫입니다. 둘 다 동일한 결과를 산출합니다.IEnumerator는 한 번에 하나씩 모든 개체에 영향을 미치는 것 같습니다.

  int x = 1 
      IEnumerator<Product> ie = productQuery.GetEnumerator(); 
      while (ie.MoveNext()) 
      { 
       ie.Current.RSTATE = ie.Current.Versions.First(o => o.VersionNumber == x).RSTATE; 
       x++; 
      } 

   foreach (var product in productQuery) 
      { 

       product.RSTATE = product.Versions.Single(o => o.VersionNumber == x).RSTATE; 
       x++; 
      } 

버전 테이블은 이전 제품에 대한 정보를 보유하고, 각은 버전 번호로 구별된다. 나는 그것이 1에서 시작할 것이고 그것이 현재 버전에 도달 할 때까지 갈 것이라고 알고있다. 나의 쿼리는 적절한 수의 제품을 리턴한다.

어떤 조언을 주셔서 감사합니다.

+0

디버거가 뭐라고 말합니까? 코드 실행 포인트와 같은 것을 확인하고, 진정으로 다른 객체를 가지고 있다면. –

답변

0

제품에 고유 한 ID 열이 있으므로 제품의 인스턴스가 하나만 수정되면 제품이 모두 변경되기 때문에 외관상 모든 제품이 변경됩니다. 마치 드로잉 보드로 돌아간 것처럼 보입니다.

1

람다 식에서 변수 x을 클로저로 만드는 것처럼 보입니다.하지만 람다 식을 바로 실행하기 때문에 문제가 발생한다는 것은 조금 이상합니다. 지연된 실행이 없습니다. 이 효과는 일반적으로 폐쇄 문제의 근원이됩니다.

아직도, 그것과 같이, 루프 내부의 변수 x의 사본을 복용 시도하고 그래도 문제가 해결되는지 확인 — 문제를 일으키는 폐쇄 있는지 테스트하는 하나 개의 방법이있다 : 또한

foreach (var product in productQuery) 
{ 
    int y = x; 
    product.RSTATE = product.Versions.Single(o => o.VersionNumber == y).RSTATE; 
    x++; 
} 

, 나는 당신이 .Select() 프로젝션으로 전체 루프 (그러므로 그 이슈)를 피할 수 있다고 의심하지만, 제품 오브젝트가 가변적으로 설계 되었기 때문에 조금 까다 롭습니다.

+0

나는 응답을 평가한다. 나는 당신과 일치하도록 코드를 변경했으나 문제를 해결하지 못했습니다. – PFranchise

+0

흠, 나는 아직도 이것에 익숙하지 않으므로 이것을 할 수있는 더 쉬운 방법이있을 것이라고 확신하지만, 그것이 무엇이 될지 확신하지 못합니다. .select()를 살펴보고 도움이되는지 확인합니다. – PFranchise

+0

오, 내 원래 쿼리를 변경하는 것에 대해 이야기하고 있습니까? 미안하지만, 바보 같은 질문 일지 모르지만, 그것이 내가 현재 알고있는 유일한 선택입니다. 편집 : 신경 쓰지 마, 내가 무슨 뜻인지 알 것 같아. product.select()와 같은 작업. – PFranchise

관련 문제