Оновіть кілька рядків у Entity Framework зі списку ідентифікаторів


95

Я намагаюся створити запит для фреймворку сутності, який дозволить мені скласти список ідентифікаторів та оновити поле, пов'язане з ними.

Приклад в SQL:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

Як перетворити вищевказане в сутність фреймворку?


Яка ваша платформа баз даних Oracle mysql ..
zee

У моїй базі даних є Microsoft SQL
кодований

Існує два проекти з відкритим кодом, що дозволяють це: EntityFramework.Extended та E ntity Framework Extensions .
Пітер Керр

Єдина правильна відповідь на це: не можна. Звичайно, ви можете витягнути Friendз бази даних усі відповідні s, оновити їх властивості msgSentByта зберегти зміни. Але EF запускає UPDATEзаяви для кожного окремого запису. Це зовсім не те саме, що масове оновлення з одним висловленням. Як вже було сказано, шукайте сторонні бібліотеки, які пропонують масове оновлення.
Герт Арнольд

Відповіді:


166

щось на зразок нижче

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

ОНОВЛЕННЯ:

Ви можете оновити декілька полів, як показано нижче

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

Чи можу я оновити більше одного поля в foreach вище, що ви щойно надіслали, саме про це я просив. просто цікаво, чи можете ви зробити більше? Також не схоже, що SubmitChanges вже цілком працює. Я використовую останню структуру сутності. Може SaveChanges ()?
кодований

10
ForEachце метод List, і його зазвичай не рекомендується використовувати, оскільки це не дуже функціональний спосіб програмування. Просто використовуйте foreach (оператора) як звичайну людину.
BlueRaja - Danny Pflughoeft

55
Використання цього рішення генерує один запит на оновлення для кожного елемента у списку. Чи є спосіб змусити EF виконати лише один запит, як у запитанні? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow

19
Майте на увазі, що це досить неефективний спосіб зробити це з точки зору бази даних. Це не тільки видає великий оператор select, що включає кожен рядок таблиці Friends, але видає окрему команду UPDATE для кожного запису, який оновлюється. Отже, замість того, щоб видавати одну команду, ви видаєте потенційно багато багатьох команд, а також передаєте купу даних з вашої бази даних.
d512

1
@ShekharPankaj, в основному те, що ви хочете зробити, це виконати команду SQL на зразок "ОНОВИТИ НАСТРОЙКИ друзів msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Я не думаю, що EF має пряму підтримку для цього. Я вважаю, що для цього є деякі сторонні рішення ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ), але я їх не використовував. Інші варіанти - використовувати сирий ADO.NET замість EF.
d512

0
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

Ви можете використовувати foreach для оновлення кожного елемента, який відповідає вашим умовам.

Ось приклад більш загального способу:

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

Загалом, ви, швидше за все, будете використовувати асинхронні методи з await для запитів db.


Я не бачу, як це щось додає до існуючої відповіді. В основному це просто повторює.
Герт Арнольд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.