как обновить несколько строк одновременно с помощью 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 75

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

}

надеюсь кому-нибудь поможет.