Подтвердить что ты не робот

Обновление записей с использованием LINQ

Мне нужно установить значение в таблице для подмножества строк. В SQL я бы сделал следующее:

UPDATE dbo.Person SET is_default = 0 WHERE person_id = 5

Есть ли способ сделать это в LINQ?

В настоящее время я использую:

var result = (from p in Context.People....)

обозначения.

Есть ли способ обновления, который я могу использовать? Или мне нужно получить все записи, а затем обновлять их один за другим в Foreach?

Это самый эффективный способ, если это возможно?

(from p in Context.person_account_portfolio where p.person_id == personId select p)
   .ToList()
   .ForEach(
       x =>
       x.is_default =
       false);
4b9b3361

Ответ 1

Это сработало лучше.

(from p in Context.person_account_portfolio 
 where p.person_id == personId select p).ToList()
                                        .ForEach(x => x.is_default = false);

Ответ 2

Я предполагаю, что person_id является первичным ключом таблицы Person, поэтому здесь, как вы обновляете одну запись:

Person result = (from p in Context.Persons
              where p.person_id == 5
              select p).SingleOrDefault();

result.is_default = false;

Context.SaveChanges();

и здесь, как вы обновляете несколько записей:

List<Person> results = (from p in Context.Persons
                        where .... // add where condition here
                        select p).ToList();

foreach (Person p in results)
{
    p.is_default = false;
}

Context.SaveChanges();

Ответ 3

У меня есть два варианта:

  • Выполняйте свой запрос, перебирайте его, чтобы изменить сущности, затем вызовите SaveChanges().
  • Выполните команду SQL, как вы упомянули в начале своего вопроса. Чтобы узнать, как это сделать, посмотрите эту страницу.

Если вы используете вариант 2, вы теряете часть абстракции, которую предоставляет Entity Framework, но если вам нужно выполнить очень большое обновление, это может быть лучшим выбором по соображениям производительности.

Ответ 4

Как дополнение к принятому ответу, вы можете обнаружить, что ваш код выглядит более последовательным при использовании синтаксиса метода LINQ:

Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);

.ToList() необходимо, потому что .ForEach() определяется только на List<T>, а не на IEnumerable<T>. Просто знайте, что .ToList() собирается выполнить запрос и загрузить все соответствующие строки из базы данных до выполнения цикла.

Ответ 5

Да, вы должны получить все записи, обновить их, а затем вызвать SaveChanges.

Ответ 6

Да. Вы можете использовать foreach для обновления записей в linq. Нет ухудшения производительности.

вы можете убедиться, что стандартный Где оператор реализован с использованием yield конструкцию, введенную в С# 2.0.

использование урожая имеет интересное преимущество, которое заключается в том, что запрос фактически не оценивается до тех пор, пока он не будет повторен, либо с foreach или вручную используя базовый GetEnumerator и методы MoveNext

Например,

var query = db.Customers.Where (c => c.Name.StartsWith ("A"));
query = query.Where (c => c.Purchases.Count() >= 2);
var result = query.Select (c => c.Name);

foreach (string name in result)   // Only now is the query executed!
   Console.WriteLine (name);

Исключительные операторы: Во-первых, ElementAt, Sum, Average, All, Any, ToArray и ToList заставляют немедленную оценку запросов.

Поэтому не нужно пугать, чтобы использовать foreach для update результат linq.

В вашем примере кода кода, приведенном ниже, будет полезно обновить многие свойства,

 var persons = (from p in Context.person_account_portfolio where p.person_name == personName select p);

//TO update using foreach

foreach(var person in persons)
{
//update property values
}  

Надеюсь, это поможет...

Ответ 7

Странно, для меня это SubmitChanges, а не SaveChanges:

    foreach (var item in w)
    {
        if (Convert.ToInt32(e.CommandArgument) == item.ID)
        {
            item.Sort = 1;
        }
        else
        {
            item.Sort = null;
        }
        db.SubmitChanges();            
    }