2011-03-15 29 views
17

¿Cuál es la forma más sucinta/simple de actualizar una sola propiedad de un elemento específico dentro de una colección usando LINQ?Consultar y actualizar una propiedad en una colección usando LINQ

Por ejemplo si tengo una lista de los siguientes:

public class Ticket 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public bool Selected { get; set; } 
} 

¿Cómo puedo usar LINQ para actualizar la propiedad "Selected" de un artículo del boleto wheres su propiedad "Name" tiene el valor de "Beach ". En SQL sería:

UPDATE Tickets SET Selected = true WHERE Name = 'Beach' 

pensé que estaba en el camino correcto con esto ...

tickets.Select(x => { x.Selected = true; return x; }).ToList().Where(x => x.Name == "Beach"); 

Respuesta

27

Puede cambiar el orden, a continuación, utilizar el operador ParaCada:

tickets 
    .Where(x => x.Name == "Beach") 
    .ToList() 
    .ForEach(x => { x.Selected = true; }); 

Nota:

  • que el ToList() es necesaria porque IEnumerable no soporta ParaCada en LINQ - ver LINQ equivalent of foreach for IEnumerable<T>
  • que para facilitar la lectura podría ser mejor separar esto en una consulta LINQ y luego un foreach(x in list) C# bucle más convencional
  • si esto es LINQ-a -sql, entonces deberá llamar al SubmitChanges() para conservar sus cambios.
+1

Por qué ToList()? Claro que estaba en el OP, pero probablemente sea una sobrecarga innecesaria. –

+0

El motivo es - http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Stuart

+0

'IEnumerable' no admite' .ForEach() ', por lo que es necesario. – BrokenGlass

1

Permítanme comenzar diciendo esto, no use LINQ para establecer propiedades como esa, así no es como se pretendía utilizar LINQ.

debe escribir la consulta para seleccionar las filas que se van a cambiar, cambiarlas en un bucle, y enviar los cambios a la base de datos (si LINQ a SQL).

var query = tickets.Where(ticket => ticket.Name == "Beach"); 
foreach (var item in query) 
    item.Selected = true; 

// if LINQ to SQL 
context.SubmitChanges(); 
+6

Jeff, ¿puede darnos una razón por la que cree que LINQ no debe usarse de esta manera? ForEach() está haciendo exactamente lo mismo que su bucle foreach. – IsolatedStorage

+0

@IsolatedStorage ForEach no es parte de LINQ de todos modos ... El motivo es que nadie espera que Where/Select/Any/All actualice los objetos existentes, ya que al hacerlo se creará confusión ... La ejecución diferida lo hace aún más entretenido. –

8

poco tarde para una respuesta pero creo que no tenemos que convertir a ToList() como se ha mencionado por Stuart lo que realmente podemos hacer es modificar el código Stuart (que es una gran pieza de código) de la siguiente manera

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => x.Selected = true); 

Otra opción

tickets 
    .Where(x => x.Name == "Beach") 
    .All(x => { x.Selected = true; return true; }); 
Cuestiones relacionadas