먼저 LinqExtensions라는 클래스를 만들어 Linq에 Each 옵션을 추가합니다.
public static class LinqExtensions
{
public static void Each<T>(this IEnumerable<T> source, Action<T> method)
{
foreach (var item in source)
{
method(item);
}
}
}
그런 다음 결합을 사용하여 원본 개체가 포함 된 새 개체 목록을 적절한 값으로 반환 할 수 있습니다. 각 객체를 반복하여 매개 변수로 값을 할당하거나 각 객체에 전달할 수 있습니다.
할당 예 :
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeProperty=o.AValueIWant);
매개 변수 전달 예 :
objectA.Join(objectB,a=>a.Id,b=>b.Id,(a,b) => new {a,b.AValueIWant}).Each(o=>o.a.SomeMethod(o.AValueIWant));
이의 좋은 점은 ObjectA 및 ObjectB가 같은 유형이 될 필요가 없다는 것입니다. 나는 룩업 (lookup)과 같은 Dictionary에 조인 된 객체의리스트를 가지고이를 수행했다. 나쁜 일은 무슨 일이 일어나고 있는지 분명하지 않다는 것입니다. 각 확장을 건너 뛰고 이렇게 작성하는 것이 좋습니다.
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);
}
하지만 더 명확하게 아마 이런 짓을 했을까 :
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;
}
가 읽기 전용이 될 것이며,이 작품 유일한 이유가 있기 때문에 당신은 당신의 새로운 오브젝트의 전체 ObjectA를 반환해야합니다 컬렉션의 개체가 참조되어 개체의 속성을 변경할 수 있습니다.
하지만 결국 LINQ 조인을 건너 뛰고 컬렉션을 반복하고 일치하는 항목을 찾는 것이 미래의 유지 관리에 도움이됩니다. LINQ는 대단 합니다만 망치를 가지고있을 때처럼 모든 것을 못 만들지는 않습니다. 컬렉션을 가지고있을 때 LINQ가 답이라는 것을 의미하지는 않습니다.
이것은 linq-to-sql에서 작동하지 않습니다. '[NotMapped]'속성을 가진 속성이 있습니다. – th1rdey3