Как обновлять несколько строк за раз, используя linq для 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

скажите, пожалуйста, как обновить статус выше всех остальных. [2,3,4 за раз].?

спасибо

Ответ 1

Чтобы обновить один столбец, приведены некоторые варианты синтаксиса:

Вариант 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()

Ответ 2

Не используйте метод ToList(), как в принятом ответе!

Запуск профилировщика SQL, я проверил и обнаружил, что функция ToList() получает все записи из базы данных. Это действительно плохая производительность!

Я бы выполнил этот запрос с помощью чистой команды sql следующим образом:

string query = "Update YourTable Set ... Where ...";    
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));

Это будет работать с обновлением одним выстрелом без выбора даже одной строки.

Ответ 3

Это я, что я сделал:

От SQL:

  update Shop set Order=5 where ShopID=123 and Type=12

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

}
}

Занимает некоторое время, чтобы обновить, если нужно обновить большее количество строк, оцените, сможет ли кто-нибудь улучшить это.

Надежда помогает кому-то.