2014-03-01 3 views
4

linq 문에서 인덱스 값을 어떻게 증가시킬 수 있습니까?표현식 트리에 대입 연산자가 없을 수 있습니까?

int headIndex = -1; 
      // int itemIndex = -1; 
      lst = (from xx in db.vwCustomizationHeaders 
        where xx.ProductID == pID 
        select new custHeader() 
        { 
         headIndex = headIndex++,// Guid.NewGuid(), 
      } 
+4

쿼리는 서버 측에서 실행됩니다. 말할 것도없이 외부 변수를 수정할 수 있다는 것은 상상할 수 없습니다. 먼저 쿼리 ('.ToArray()', 등)를 실행 한 다음 그것을 반복해서 반복해야합니다. 게다가,'select' 절에서 상태를 수정하는 것은 실제로 좋지 않습니다. –

+0

어떻게 내가 다음 선택에서 수정해야합니까? – NoviceToDotNet

+2

'foreach' 루프 ('.ToArray'의 결과를 통해)는 훌륭하게 작동합니다. –

답변

4

당신이 코드에서이 쿼리를 작성하는 동안 : 그것은 실제로 데이터베이스에을 실행하는 것

from xx in db.vwCustomizationHeaders 
where xx.ProductID == pID 
select new custHeader() 
{ 
    headIndex = headIndex++ 
} 

합니다. 그리고 데이터베이스는 코드의 값을 수정할 수 없습니다. 따라서 데이터베이스에서 해당 코드 로컬 값 (headIndex)을 증가시킬 수 없습니다. (또한 @Kirk Woll이 지적했듯이 select와 같은 값을 수정하는 것은 매우 나쁜 습관입니다. select는 상태를 변경하거나 부작용을 일으키지 않고 상태를 변경하거나 부작용을 일으키지 않고 select 또는 가져와야합니다.)

모두 ' 그 값을 업데이트하면 선택을 사용할 필요가 없습니다. 에서

lst = (from xx in db.vwCustomizationHeaders 
where xx.ProductID == pID 
select new custHeader() 
{ 
    SomeField = xx.SomeField, 
    AnotherField = xx.SomeOtherField 
    // etc. 
}); 

: 주석 처리 된 부분은 당신은 또한,하지만 이런 일을 vwCustomizationHeader의 목록을 작성하고 제안

headIndex += db.vwCustomizationHeaders.Count(ch => ch.ProductID == pID); 

: 사용자가 직접 값으로 레코드의 수를 추가 할 수 있습니다 거기에 lst 개체를 사용하여 카운터를 수정할 수 있습니다.

headIndex += lst.Count(); 
+1

실제로 나는 인덱스를 첨부해야합니다. 그래서 나는 clietn 쪽에서 anjualar.js를 반복 할 수 있습니다 .. – NoviceToDotNet

+0

만약 내가 Guid를 사용한다면 그것은 신의 선택입니까? – NoviceToDotNet

+1

@NoviceToDotNet : 특별한 이유가없는 한'Guid'를 제안하지 않겠습니다. 단지 반복 할 필요가 있다면, 정수는 그 일을 잘 할 것입니다. 값을 데이터베이스에서 가져온 후 값을 반복 할 수 있습니다. 예를 들어 foreach (var item in lst) item.HeadIndex = headIndex ++; 당연히,'select'는 자리 표시 자 필드를 만들어야합니다 :'select new custHeader() {HeadIndex = 0, SomeField = xx.SomeField, etc.}' – David

관련 문제