Aby zaktualizować jedną kolumnę, oto kilka opcji składni:
opcja 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();
}
Opcja 2
using (var db=new SomeDatabaseContext())
{
db.SomeTable
.Where(x=>ls.Contains(x.friendid))
.ToList()
.ForEach(a=>a.status=true);
db.SubmitChanges();
}
Wariant 3
using (var db=new SomeDatabaseContext())
{
foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
{
some.status=true;
}
db.SubmitChanges();
}
Aktualizacja
Zgodnie z prośbą zawartą w komentarzu warto pokazać, jak zaktualizować wiele kolumn. Powiedzmy więc na potrzeby tego ćwiczenia, że nie chcemy tylko aktualizować status
at one. Chcemy zaktualizować name
i status
gdzie friendid
pasuje. Oto kilka opcji składni:
opcja 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();
}
Opcja 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();
}
Wariant 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();
}
Zaktualizuj 2
W odpowiedzi użyłem LINQ to SQL iw tym przypadku do zatwierdzenia do bazy danych użyto:
db.SubmitChanges();
Ale aby Entity Framework zatwierdził zmiany, jest to:
db.SaveChanges()
records.ForEach(x=> { x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });
db.SaveChanges()
i nie powinnodb.SubmitChanges()
?ToList()
? To zabójcaNie używaj
ToList()
metody jak w zaakceptowanej odpowiedzi!Uruchamiając profiler SQL, zweryfikowałem i stwierdziłem, że
ToList()
funkcja pobiera wszystkie rekordy z bazy danych. To naprawdę kiepski występ !!Uruchomiłbym to zapytanie za pomocą czystego polecenia sql w następujący sposób:
string query = "Update YourTable Set ... Where ..."; context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));
Spowoduje to uruchomienie aktualizacji w jednym ujęciu bez wybierania nawet jednego wiersza.
źródło
Oto co zrobiłem:
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(); }
Nadzieja pomaga komuś.
źródło
feature
a także nie powinieneś dodawać, że wcontext.SaveChanges()
środkuforeach
powinna znajdować się poza pętlą foreach.