2014-03-01 56 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應該只是獲取/構建一些東西,而不是改變狀態或產生副作用。)

如果你所有的東西都是「重新做更新的價值,你不需要使用選擇。您可以添加的記錄的計數直接值:

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

被註釋掉的部分建議,你還建設的vwCustomizationHeader的List雖然,這樣的事情:

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

從您可以使用lst對象修改您的計數器:

headIndex += lst.Count(); 
+1

實際上,我需要附上一個索引,以便我可以在clietn側的anjualar.js中迭代。 – NoviceToDotNet

+0

如果我使用Guid,那是上帝的選擇嗎? – NoviceToDotNet

+1

@NoviceToDotNet:除非有特定的原因使用一個,否則我不會建議一個'Guid'。如果你只需要迭代,一個整數就可以完成這項工作。你可以在從數據庫中得到它們後迭代這些值,例如:'foreach(var in lst)item.HeadIndex = headIndex ++;'。當然,你的'select'需要創建一個佔位符字段:'select new custHeader(){HeadIndex = 0,SomeField = xx.SomeField,等等}' – David

相關問題