Varlık Çerçevesinde Birden Çok Satırı bir kimlik listesinden güncelleme


95

Kimliklerin bir listesini almamı ve onlarla ilişkili bir alanı güncellememi sağlayacak varlık çerçevesi için bir sorgu oluşturmaya çalışıyorum.

SQL'deki örnek:

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

Yukarıdakileri varlık çerçevesine nasıl dönüştürebilirim?


Veritabanı platformunuz nedir Oracle mysql ..
zee

Veritabanım Microsoft SQL
14'te

Buna izin veren iki açık kaynaklı proje vardır: EntityFramework.Extended ve E ntity Framework Extensions .
Peter Kerr

Buna verilecek tek doğru cevap şudur: yapamazsınız. Elbette, eşleşen tüm URL'leri Friendveritabanından çekebilir , özelliklerini güncelleyebilir msgSentByve değişiklikleri kaydedebilirsiniz. Ancak EF, UPDATEher kayıt için ifadeleri ateşleyecektir . Bu, tek ifadeli toplu güncelleme ile aynı şey değildir. Söylendiği gibi, toplu güncelleme sunan bir üçüncü taraf kitaplığı arayın.
Gert Arnold

Yanıtlar:


167

aşağıdaki gibi bir şey

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

GÜNCELLEME:

aşağıdaki gibi birden fazla alanı güncelleyebilirsiniz

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

Az önce gönderdiğiniz yukarıdaki foreach alanında birden fazla alanı güncelleyebilir miyim? sadece daha fazlasını yapabilir misin? Ayrıca SubmitChanges artık işe yarıyor gibi görünmüyor. En son varlık çerçevesini kullanıyorum. Belki SaveChanges ()?
2014

10
ForEachbir yöntemdir Listve genellikle kullanılması tavsiye edilmez çünkü çok işlevsel bir programlama yolu değildir. foreach (Operatörü) normal bir insan gibi kullanın .
BlueRaja - Dany Pflughoeft

55
Bu çözümü kullanmak, listedeki her öğe için bir güncelleme sorgusu oluşturur. EF'nin sorudaki gibi tek bir sorgu yapmasını sağlamanın bir yolu var mı? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow

19
Bunun, bunu veritabanı perspektifinden yapmanın oldukça verimsiz bir yolu olduğunu unutmayın. Bu yalnızca Arkadaşlar tablosundaki her satırı içeren büyük bir seçim ifadesi yayınlamakla kalmaz, aynı zamanda güncellenen her kayıt için ayrı bir GÜNCELLEME komutu verir. Dolayısıyla, tek bir komut vermek yerine, potansiyel olarak birçok komut veriyorsunuz ve aynı zamanda veritabanınızdan bir sürü veriyi aktarıyorsunuz.
d512

1
@ShekharPankaj, temelde yapmak istediğiniz şey "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)" gibi bir SQL komutu yayınlamaktır. EF'in bunu yapmak için doğrudan desteği olduğunu sanmıyorum. Bunun için bazı üçüncü taraf çözümleri olduğuna inanıyorum ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) ancak bunları kullanmadım. Diğer seçenekler, EF yerine ham ADO.NET kullanmaktır.
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";
}

Koşulunuzu karşılayan her bir öğeyi güncellemek için foreach'i kullanabilirsiniz.

İşte daha genel bir şekilde bir örnek:

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

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

Genel olarak, büyük olasılıkla await for db queries ile async metodları kullanacaksınız.


Bunun mevcut cevaba nasıl bir şey kattığını anlamıyorum. Temelde sadece tekrar ediyor.
Gert Arnold

temel fark arkadaş yerine foreach kullanmaktır. Her biri için
Raphael Pinel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.