【问题标题】:An expression tree may not contain an assignment operator?表达式树可能不包含赋值运算符?
【发布时间】:2014-03-01 22:43:55
【问题描述】:

如何在 linq 语句中增加索引值。

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

【问题讨论】:

  • 您的查询在服务器端执行。不用说,您可以修改外部变量是不可思议的。您将必须首先执行查询(.ToArray() 等),然后对其进行迭代以递增。此外,在 select 子句中修改状态是非常糟糕的做法。
  • 那么我应该如何修改不在选择中..?
  • 一个foreach 循环(在.ToArray 的结果之上)会很好用。
  • 即使这是可能的,但事实并非如此,headIndex = headIndex++ 到底是什么意思? headIndex++ 已经意味着“增加headIndex”,那么为什么还要分配给刚刚增加的东西刚刚增加的东西?
  • @NoviceToDotNet:啊,我明白了,您正在使用对象初始化程序来分配具有相同名称的本地字段。 请永远不要这样做。它使代码非常难以阅读。

标签: c# linq


【解决方案1】:

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

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);

注释掉的部分表明您也在构建vwCustomizationHeaders 的列表,如下所示:

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

您可以从那里使用lst 对象来修改您的计数器:

headIndex += lst.Count();

【讨论】:

  • 实际上我需要附加一个索引,以便我可以在客户端的 anjualar.js 中进行迭代..
  • 如果我使用 Guid 是上帝的选择吗?
  • @NoviceToDotNet:我不建议使用Guid,除非有特定的理由使用它。如果你只需要迭代,一个整数就可以完成这项工作。从数据库中获取值后,您可以对其进行迭代,例如:foreach (var item in lst) item.HeadIndex = headIndex++;。当然,您的 select 需要创建一个占位符字段:select new custHeader() { HeadIndex = 0, SomeField = xx.SomeField, etc. }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多