2011-11-14 11 views
15

Tengo la siguiente consulta de Entity Framework:LINQ a Objetos Únete dos colecciones para establecer valores en la primera colección

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

estoy usando AutoMapper a asignar a otro tipo:

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

En my Objects.Result type, tengo una propiedad llamada reason que no proviene de la base de datos. Que proviene de otra fuente que necesito para llenar básicamente de nuevo en mi tipo de mapeado:

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

necesito para unirse a las razones de mi colección asignada y establecer la propiedad Razón en mi colección asignada utilizando el valor de mis razones colección. 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 no es capaz de escribir código que hace que lo que yo quiero?

Respuesta

21

Haga la mutación en un bucle. De manera óptima, Linq debería estar libre de mutaciones para la (s) colección (es) contra las que opera. Use Linq para filtrar, ordenar, proyectar sus datos, use 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; 
} 
+0

Gracias. Supongo que desde el punto de vista del rendimiento no es un gran éxito ya que estoy paginando los datos antes de mapear, por lo que iterar por segunda vez no será un problema. – Dismissile

+0

Si mide y descubre que se trata de un cuello de botella de rendimiento, regrese y solucione el problema, * podemos * hacer una mutación si * tenemos *. Sin embargo, no haría eso hasta que supiera que esto es lo que me está frenando. –

+0

I página alrededor de 10 artículos a la vez. Dudo mucho que pueda causar problemas de rendimiento :) – Dismissile

0

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 es la aplicación es bastante cerca de su pseudo-código.

5

Esto puede ahorrarle mucho tiempo. El siguiente código es para Unir dos colecciones y 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(); 
+1

Debe explicar qué está haciendo esto. –

Cuestiones relacionadas