我是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
感谢您的帮助!!抱歉我的英语不好。
答案 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