from - linq c#
LINQ to Objects Une dos colecciones para establecer valores en la primera colección (3)
Tengo la siguiente consulta de Entity Framework:
var results = from r in db.Results
select r;
Estoy usando AutoMapper para mapear a otro tipo:
var mapped = Mapper.Map<IEnumerable<Database.Result>, IEnumerable<Objects.Result>>(results);
En mi tipo de Objects.Result, tengo una propiedad llamada razón que no proviene de la base de datos. Viene de otra fuente que básicamente necesito rellenar de nuevo en mi tipo mapeado:
var reasons = new List<Reason>
{
new Reason { Id = 1, Reason = "asdf..." }
};
Necesito unir las razones con mi colección asignada y establecer la propiedad Razón en mi colección asignada usando el valor de mi colección de razones. es posible?
// 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;
Obviamente, el código anterior no se compila, pero ¿hay un código que pueda escribir que haga lo que quiero?
Esto puede ahorrar mucho de su tiempo. El siguiente código es para Unir dos colecciones y para establecer el valor de propiedad de la primera colección.
class SourceType
{
public int Id;
public string Name;
public int Age { get; set; }
// other properties
}
class DestinationType
{
public int Id;
public string Name;
public int Age { get; set; }
// other properties
}
List<SourceType> sourceList = new List<SourceType>();
sourceList.Add(new SourceType { Id = 1, Name = "1111", Age = 35});
sourceList.Add(new SourceType { Id = 2, Name = "2222", Age = 26});
sourceList.Add(new SourceType { Id = 3, Name = "3333", Age = 43});
sourceList.Add(new SourceType { Id = 5, Name = "5555", Age = 37});
List<DestinationType> destinationList = new List<DestinationType>();
destinationList.Add(new DestinationType { Id = 1, Name = null });
destinationList.Add(new DestinationType { Id = 2, Name = null });
destinationList.Add(new DestinationType { Id = 3, Name = null });
destinationList.Add(new DestinationType { Id = 4, Name = null });
var mapped= destinationList.Join(sourceList, d => d.Id, s => s.Id, (d, s) =>
{
d.Name = s.Name;
d.Age = s.Age;
return d;
}).ToList();
Hacer la mutación en un bucle. De manera óptima, Linq debe estar libre de mutaciones en las colecciones contra las que opera. Utilice Linq para filtrar, ordenar, proyectar sus datos, usar técnicas tradicionales para modificar.
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;
}
Un método de fuerza bruta sería:
foreach(var m in mapped)
{
m.Reason = reasons.Single(r=> r.Id == m.Id).Reason;
}
De hecho, esta implementación está bastante cerca de tu pseudocódigo.