Primero extienda Linq para tener una opción Cada creando una clase llamada LinqExtensions.
public static class LinqExtensions
{
public static void Each<T>(this IEnumerable<T> source, Action<T> method)
{
foreach (var item in source)
{
method(item);
}
}
}
Luego puede usar Unirse para devolver una lista de objetos nuevos que contienen los objetos originales con su valor apropiado. The Each repetirá sobre ellos permitiéndole asignar o pasar los valores como parámetros a cada objeto.
ejemplo Asignación:
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeProperty=o.AValueIWant);
Parámetro que pasa ejemplo:
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeMethod(o.AValueIWant));
Lo bueno de esto es que Objecta y ObjectB no tienen que ser del mismo tipo. He hecho esto con una lista de objetos unidos a un Diccionario (como una búsqueda). Lo malo es que no está claro qué está pasando. Sería mejor omitir cada extensión y escribirla así.
foreach(var change in objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}))
{
change.a.SomeProperty = change.AValueIWant;
change.a.SomeMethod(change.AValueIWant);
}
Sin embargo, para mayor claridad, Probablemente ello:
foreach(var update in objectA.Join(objectB,objectA=>objectA.Id,objectB=>objectB.Id,(objectA,objectB) => new {objectA, Value = objectB.AValueIWant}))
{
update.objectA.SomeProperty = update.Value;
}
Tendrá que devolver todo el Objecta en su nuevo objeto, porque va a ser de sólo lectura y la única razón por la que esto funciona es porque se hace referencia a los objetos de una colección, lo que le permite realizar cambios en las propiedades de los objetos.
Pero al final sería más claro omitir el LINQ join all together y simplemente recorrer las colecciones y buscar coincidencias, esto ayudará con el mantenimiento futuro. LINQ es increíble, pero al igual que cuando tienes un martillo no hace que todo sea un clavo, cuando tienes una colección no significa que LINQ es la respuesta.
esto no funciona para linq-to-sql donde tengo una propiedad que tiene el atributo '[NotMapped]' – th1rdey3