web-dev-qa-db-fra.com

Comment mettre à jour plusieurs lignes à la fois en utilisant linq to SQL?

Table:

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 l'utilisateur envoie userid = 1, friendids = 2,4,5 status = true

s'il vous plaît dites-moi la requête pour savoir comment mettre à jour ce qui est au-dessus de tout le statut des amis est vrai. [2,3,4 à la fois].?

merci

82
user1237131

Pour mettre à jour une colonne, voici quelques options de syntaxe:

Option 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();
}

Option 2

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

     db.SubmitChanges();
}

Option

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

Mise à jour

Comme demandé dans le commentaire, il peut être judicieux de montrer comment mettre à jour plusieurs colonnes. Supposons donc que, dans le cadre de cet exercice, nous ne voulions pas simplement mettre à jour les status. Nous voulons mettre à jour name et status là où friendid correspond. Voici quelques options de syntaxe pour cela:

Option 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();
}

Option 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();
}

Option

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();
}

Mise à jour 2

Dans la réponse, j'utilisais LINQ to SQL et dans ce cas, pour valider dans la base de données, l'utilisation est la suivante:

db.SubmitChanges();

Mais pour Entity Framework de valider les modifications, il s’agit:

db.SaveChanges()
215
Arion

Ne pas utiliser la méthode ToList() comme dans la réponse acceptée!

En exécutant le profileur SQL, j’ai vérifié et constaté que la fonction ToList() récupère tous les enregistrements de la base de données. C'est vraiment une mauvaise performance !!

J'aurais exécuté cette requête par commande SQL pure comme suit:

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

Cela permettrait d’effectuer la mise à jour en une fois sans même sélectionner une seule ligne.

18
Jacob

C'est ce que j'ai fait:

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 aide quelqu'un.

2
stom