LINQ to Objects Join two collections to set values in the first collection

Dismissile picture Dismissile · Nov 14, 2011 · Viewed 39.2k times · Source

I have the following Entity Framework query:

var results = from r in db.Results
              select r;

I'm using AutoMapper to map to another type:

var mapped = Mapper.Map<IEnumerable<Database.Result>, IEnumerable<Objects.Result>>(results);

In my Objects.Result type, I have a property called reason that is not coming from the database. It is coming from another source that I need to basically populate back into my mapped type:

var reasons = new List<Reason>
{
    new Reason { Id = 1, Reason = "asdf..." }
};

I need to join the reasons with my mapped collection and set the Reason property in my mapped collection using the value from my reasons collection. Is this possible?

 // need something like this:
 mapped = from m in mapped
          join r in reasons on m.Id equals r.Id
          update m.Reason = r.Reason
          select m;

Obviously the above code doesn't compile, but is there code I can write that does what I want?

Answer

Anthony Pegram picture Anthony Pegram · Nov 14, 2011

Do the mutation in a loop. Optimally, Linq should be free of mutations to the collection(s) it operates against. Use Linq to filter, order, project your data, use traditional techniques to modify.

var joinedData = from m in mapped 
                 join r in reasons on m.Id equals r.Id 
                 select new { m, r };

foreach (var item in joinedData)
{
    item.m.Reason = item.r.Reason;
}