2014-03-01 49 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

相关问题