как обновить несколько строк одновременно с помощью linq to sql?
стол:
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
если пользователь отправляет userid=1, friendids=2,4,5 status=true
пожалуйста, скажите мне, что запрос о том, как обновить выше всех friendids статус true. [2,3,4 одновременно].?
спасибо
3 ответа:
чтобы обновить один столбец вот некоторые параметры синтаксиса:
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
на них. Мы хотим обновить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()
не использовать
ToList()
метод, как принято отвечать !запустив SQL profiler, я проверил и обнаружил, что
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(); }
надеюсь кому-нибудь поможет.