Perbarui Beberapa Baris dalam Kerangka Entitas dari daftar id

95

Saya mencoba membuat kueri untuk kerangka entitas yang akan memungkinkan saya untuk mengambil daftar id dan memperbarui bidang yang terkait dengannya.

Contoh di SQL:

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

Bagaimana cara mengubah kerangka kerja di atas menjadi entitas?

allencoded
sumber
Apa platform database Anda Oracle mysql ..
zee
Database saya adalah Microsoft SQL
disandikan
Ada dua proyek open source yang memungkinkan ini: EntityFramework.Extended dan E ntity Framework Extensions .
Peter Kerr
Satu-satunya jawaban yang benar untuk ini adalah: Anda tidak bisa. Tentu, Anda dapat menarik semua yang cocok Frienddari database dan memperbarui propertinya msgSentBydan menyimpan perubahan. Tetapi EF akan UPDATEmengeluarkan pernyataan untuk setiap catatan individu. Itu sama sekali tidak sama dengan pembaruan massal satu pernyataan. Seperti yang dikatakan, cari pustaka pihak ketiga yang menawarkan pembaruan massal.
Gert Arnold

Jawaban:

167

sesuatu seperti di bawah ini

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

MEMPERBARUI:

Anda dapat memperbarui beberapa bidang seperti di bawah ini

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });
Sial
sumber
Dapatkah saya memperbarui lebih dari satu bidang di foreach di atas yang baru saja Anda kirim sesuai dengan yang saya minta. hanya ingin tahu apakah Anda bisa berbuat lebih banyak? Juga sepertinya SubmitChanges tidak berfungsi lagi. Saya menggunakan kerangka entitas terbaru. Mungkin SaveChanges ()?
semuanya disandikan
10
ForEachadalah metode aktif List, dan umumnya tidak disarankan untuk digunakan karena ini bukan cara pemrograman yang sangat fungsional. Gunakan saja foreach (operator) seperti orang normal.
BlueRaja - Danny Pflughoeft
55
Menggunakan solusi ini menghasilkan satu kueri pembaruan untuk setiap elemen dalam daftar. Apakah ada cara agar EF melakukan hanya satu kueri seperti di pertanyaan? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow
19
Ketahuilah bahwa ini adalah cara yang sangat tidak efisien untuk melakukannya dari perspektif database. Ini tidak hanya mengeluarkan pernyataan pilih besar yang melibatkan setiap baris dari tabel Teman, tetapi juga mengeluarkan perintah UPDATE terpisah untuk setiap catatan yang diperbarui. Jadi, daripada mengeluarkan satu perintah, Anda berpotensi mengeluarkan banyak perintah serta mengalirkan banyak data dari database Anda.
d512
1
@ShekharPankaj, pada dasarnya yang ingin Anda lakukan adalah mengeluarkan perintah SQL seperti "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Saya tidak berpikir bahwa EF memiliki dukungan langsung untuk melakukan itu. Saya yakin ada beberapa solusi pihak ke-3 untuk ini ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) tetapi saya belum menggunakannya. Opsi lainnya adalah menggunakan ADO.NET mentah, bukan EF.
d512
-1
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";
}

Anda dapat menggunakan foreach untuk memperbarui setiap elemen yang memenuhi kondisi Anda.

Berikut ini contoh dengan cara yang lebih umum:

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

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

Secara umum, Anda kemungkinan besar akan menggunakan metode async dengan await untuk kueri db.

Raphael Pinel
sumber
Saya tidak melihat bagaimana ini menambahkan apa pun ke jawaban yang ada. Ini pada dasarnya hanya mengulanginya.
Gert Arnold
perbedaan utamanya adalah menggunakan foreach daripada menggunakan teman. ForEach
Raphael Pinel