使用LINQ更新集合中的属性

时间:2015-12-23 13:43:14

标签: vb.net linq

我是Linq的新手。

我的实际代码是

  Dim dt As DataTable = GetData()

  Dim listOrder = From a In dt _
                  Group a By key = a("Name") Into g = Group _
                  Select Id = key, TotPoints = g.Sum(Function(r)r("Points"))
                  Order By TotPoints Descending

  For Each item In listOrder 
      If item.Id = 1 Then
         item.TotPoints = CalculateNewPoints()
      End If
  Next

问题是当尝试更新属性时收到消息:属性“xxxx”是ReadOnly

感谢您的帮助!!抱歉我的英语不好。

2 个答案:

答案 0 :(得分:0)

是的,那应该是。我认为lista是一个拼写错误,它应该是item。这里的item foreach内部的迭代器是一个只读对象引用,使用它你不能像你尝试的那样执行任何写操作。而是使用for循环。

  For Each item In listOrder 
      If item.Id = 1 Then
         item.TotPoints = CalculateNewPoints()
      End If

你也可以使用另一个LINQ查询,然后像下面那样更新数据,但这只有在Id是唯一且只有Id 1的记录时才有效。

Itemtype item = listOrder.Single(x => x.Id == 1);
item.TotPoints = CalculateNewPoints();

答案 1 :(得分:0)

您正在创建匿名类型{ Id, TotPoints }的实例。稍后,您尝试修改TotPoints。但是匿名类型是不可变的,或者是只读的,所以你得到了这个例外。解决方案是立即分配正确的值:

Dim listOrder = From a In dt _
                Group a By key = a("Name") Into g = Group _
                Select _ 
                    Id = key, _
                    TotPoints = If (key = 1 _
                                    , CalculateNewPoints() _
                                    , g.Sum(Function(r)r("Points")))
                Order By TotPoints Descending