Вот несколько вариантов синтаксиса для обновления одного столбца:
Опция 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();
}
Вариант 2
using (var db=new SomeDatabaseContext())
{
db.SomeTable
.Where(x=>ls.Contains(x.friendid))
.ToList()
.ForEach(a=>a.status=true);
db.SubmitChanges();
}
Вариант 3
using (var db=new SomeDatabaseContext())
{
foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
{
some.status=true;
}
db.SubmitChanges();
}
Обновить
В соответствии с просьбой в комментарии может иметь смысл показать, как обновить несколько столбцов. Итак, предположим, для целей этого упражнения, что мы хотим не просто обновить status
at one. Мы хотим обновить name
и status
где friendid
совпадает. Вот несколько вариантов синтаксиса для этого:
Опция 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();
}
Вариант 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();
}
Вариант 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();
}
Обновление 2
В ответ я использовал LINQ to SQL, и в этом случае для фиксации в базе данных использовалось следующее:
db.SubmitChanges();
Но для Entity Framework для фиксации изменений это:
db.SaveChanges()
records.ForEach(x=> { x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });
db.SaveChanges()
и нетdb.SubmitChanges()
?ToList()
? Это убийцаНе используйте
ToList()
метод, указанный в принятом ответе!Запустив профилировщик SQL, я проверил и обнаружил, что
ToList()
функция получает все записи из базы данных. Это действительно плохая работа !!Я бы запустил этот запрос с помощью чистой команды sql следующим образом:
string query = "Update YourTable Set ... Where ..."; context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));
Это позволит выполнить обновление за один раз, не выбирая ни одной строки.
источник
Вот что я сделал:
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(); }
Надежда кому-то помогает.
источник
feature
а также вы не должны добавлятьcontext.SaveChanges()
внутри,foreach
это должно быть вне цикла foreach.