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
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()
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.
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.