Pregunta cómo actualizar las múltiples filas a la vez usando linq a sql?


Mesa:

id     userid  friendid   name    status
1      1        2         venkat  false
2      1        3         sai     true
3      1        4         arun    false
4      1        5         arjun   false

si el usuario envía userid = 1, friendids = 2,4,5 status = true

por favor dime que la consulta de cómo actualizar el estado anterior de todos los amigos es verdadera. [2,3,4 a la vez].?

Gracias


73
2018-04-25 11:19


origen


Respuestas:


Para actualizar una columna aquí hay algunas opciones de sintaxis:

Opción 1

var ls=new int[]{2,3,4};
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>a.status=true);
    db.SubmitChanges();
}

opcion 2

using (var db=new SomeDatabaseContext())
{
     db.SomeTable
       .Where(x=>ls.Contains(x.friendid))
       .ToList()
       .ForEach(a=>a.status=true);

     db.SubmitChanges();
}

Opción 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
    }
    db.SubmitChanges();
}

Actualizar

Tal como se solicitó en el comentario, podría tener sentido mostrar cómo actualizar varias columnas. Entonces, digamos, para el propósito de este ejercicio, que no solo queremos actualizar el status en los. Queremos actualizar name y status donde el friendid está haciendo juego Aquí hay algunas opciones de sintaxis para eso:

Opción 1

var ls=new int[]{2,3,4};
var name="Foo";
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

opcion 2

using (var db=new SomeDatabaseContext())
{
    db.SomeTable
        .Where(x=>ls.Contains(x.friendid))
        .ToList()
        .ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

Opción 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
        some.name=name;
    }
    db.SubmitChanges();
}

Actualización 2

En la respuesta que estaba usando LINQ to SQL y en ese caso para comprometerse con la base de datos, el uso es:

db.SubmitChanges();

Pero para Entity Framework para comprometer los cambios es:

db.SaveChanges()

194
2018-04-25 11:27



No haga utilizar el ToList() método como en la respuesta aceptada!

Al ejecutar SQL Profiler, verifiqué y encontré que ToList() función obtiene todos los registros de la base de datos. ¡Es realmente un mal rendimiento!

Hubiera ejecutado esta consulta mediante el comando sql puro de la siguiente manera:

string query = "Update YourTable Set ... Where ...";    
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));

Esto operaría la actualización de una sola vez sin seleccionar ni siquiera una fila.


10
2018-03-07 11:34



Esto es lo que hice:

EF:

using (var context = new SomeDBContext())
{


foreach (var item in model.ShopItems)  // ShopItems is a posted list with values 
{

var feature = context.Shop.Where(h => h.ShopID == 123 && h.Type == item.Type).ToList();

feature.ForEach(a => a.SortOrder = item.SortOrder);


}

context.SaveChanges();

}

Hope ayuda a alguien


1
2017-07-30 18:37