El otro día necesitaba actualizar valores en una colección de DataRows tipadas y echaba de menos no poder hacerlo con LINQ, así que me puse a buscar. Y buscando, buscando, encontré el código para un método de extensión Update que soluciona la papeleta. El código está aquí en C# y en Visual Basic quedaría así:
Public Delegate Sub Func(Of TArg0)(element As TArg0) ''' <summary> ''' Executes an Update statement block on all elements in an IEnumerable(T) sequence. ''' </summary> ''' <typeparam name=TSource">The source element type.</typeparam>" ''' <param name=source">The source sequence.</param>" ''' <param name=Updater">The update statement to execute for each element.</param>" ''' <returns>The numer of records affected.</returns> <System.Runtime.CompilerServices.Extension> _ Public Function Update(Of TSource)(source As IEnumerable(Of TSource), Updater As Func(Of TSource)) As Integer If source Is Nothing Then Throw New ArgumentNullException("source") End If If Updater Is Nothing Then Throw New ArgumentNullException("update") End If If GetType(TSource).IsValueType Then Throw New NotSupportedException("value type elements are not supported by update.") End If Dim count As Integer = 0 For Each element As TSource In source Updater(element) count += 1 Next Return count End Function
Su uso sería algo así:
TareasParaArticulo.Where(Function(x) x.IdUsuario = 0).Update(Function(x) x.IdUsuario = JefeProyecto)
Donde TareasParaArticulo es un conjunto de datarows tipadas (un list, un datatable…, tanto da). Lo que hace esta parte de la aplicación, para ponernos en situación, es crear una serie de tareas (tomadas de una plantilla de tareas) cuando un artículo es añadido a un proyecto. El uso del Update permite asignar aquellas tareas que en la plantilla tienen como IdUsuario el 0 al jefe del proyecto de una forma sencilla.