表达式树中可能不包含赋值运算符?

10

如何在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子句中修改状态是非常不好的实践。 - Kirk Woll
我应该如何修改not in select then..? - NoviceToDotNet
2
一个 foreach 循环(在 .ToArray 的结果上)将非常适合。 - Kirk Woll
1
即使这是可能的,但实际上并不是,那么headIndex = headIndex++到底意味着什么?headIndex++已经表示“增加headIndex”,那么为什么你还想从刚刚增加的东西对刚刚增加的东西进行赋值呢? - Eric Lippert
它们是两个具有相同名称的独立变量,一个来自对象,另一个是本地变量。 - NoviceToDotNet
1
@NoviceToDotNet:啊,我明白了,你正在使用对象初始化器将一个与本地变量同名的字段赋值给它。请千万不要这样做。这会使代码极难阅读。 - Eric Lippert
1个回答

9

当您在代码中创建此查询时:

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

实际上它是在数据库中执行的。数据库无法修改您代码中的值。因此,您无法从数据库中增加该代码本地值(headIndex)。此外,正如@Kirk Woll指出的那样,在选择中修改这样的值是非常糟糕的做法。选择应该只是获取/构建某些内容,而不是改变状态或产生副作用。
如果你只是更新那个值,你不需要使用一个选择。你可以直接将记录计数添加到值中:
headIndex += db.vwCustomizationHeaders.Count(ch => ch.ProductID == pID);

注释部分表明您还正在构建vwCustomizationHeader列表,类似于以下内容:
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
实际上,我需要附加一个索引,以便在客户端的angular.js中进行迭代。 - NoviceToDotNet
如果我使用Guid,这是一个好选择吗? - NoviceToDotNet
1
@NoviceToDotNet:除非有特定的原因要使用它,否则我不建议使用Guid。如果你只需要迭代,整数就可以胜任。你可以在从数据库获取值后遍历这些值,类似于:foreach(var item in lst) item.HeadIndex = headIndex++;。当然,你的select语句需要创建一个占位符字段:select new custHeader() { HeadIndex = 0, SomeField = xx.SomeField, etc. } - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接