linq to sql kullanarak bir seferde birden çok satır nasıl güncellenir?


95

Tablo:

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

kullanıcı userid = 1 gönderirse, friendids = 2,4,5 status = true

Lütfen bana yukarıdaki tüm arkadaşlık durumunun nasıl güncelleneceğine ilişkin sorguyu söyleyin. [2,3,4 bir seferde].?

Teşekkürler

Yanıtlar:


240

Bir sütunu güncellemek için bazı söz dizimi seçenekleri şunlardır:

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

seçenek 2

using (var db=new SomeDatabaseContext())
{
     db.SomeTable
       .Where(x=>ls.Contains(x.friendid))
       .ToList()
       .ForEach(a=>a.status=true);

     db.SubmitChanges();
}

3. Seçenek

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
    }
    db.SubmitChanges();
}

Güncelleme

Yorumda talep edildiği gibi, birden çok sütunun nasıl güncelleneceğini göstermek mantıklı olabilir. Diyelim ki bu alıştırmanın amacı için sadece atları güncellemek istemiyoruz status. Güncellemek nameve eşleştiği statusyeri güncellemek istiyoruz friendid. İşte bunun için bazı sözdizimi seçenekleri:

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

seçenek 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. Seçenek

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

Güncelleme 2

Yanıtta LINQ to SQL kullanıyordum ve bu durumda veritabanına bağlanmak için kullanım şudur:

db.SubmitChanges();

Ancak Entity Framework'ün değişiklikleri gerçekleştirmesi için:

db.SaveChanges()

6
Ve birden fazla yorum için yapmanız gereken:records.ForEach(x=> { x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });
JonH

2
Olması db.SaveChanges()gerekmiyor db.SubmitChanges()mu?
bradlis7

3
... Üç seçeneğiniz de aynı. Aslında ilk ikisi arasındaki tek fark, birinin değişken kullanması ve diğerinin kullanmamasıdır. Her ikisine de sahip olmak sadece artan gürültüdür.
BlueRaja - Dany Pflughoeft

3
onsuz yapmak mümkün ToList()mü? It's a killer
Toolkit

2
ToList () duruma göre tüm kayıtları veritabanından alıyor, değil mi? Bu doğruysa, gerçekten kötü bir performans olur, Ya milyonlarca kayıt varsa, bu işlevi çalıştırmak için onları belleğe yükleriz? Lütfen yanılıyorsam düzeltin.
Jacob

21

Do not kullanmak ToList()kabul cevap olarak yöntemini!

SQL profil oluşturucuyu çalıştırdığımda, ToList()işlevin veritabanından tüm kayıtları aldığını doğruladım ve buldum . Gerçekten kötü bir performans !!

Bu sorguyu saf sql komutuyla şu şekilde çalıştırırdım:

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

Bu, güncellemeyi tek bir satır bile seçmeden tek seferde çalıştırır.


3

Ben de öyle yaptım:

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

Umut birine yardım eder.


Tıkır tıkır çalışıyor!
yu yang Jian

4
bu kötü, kaydı almak için her seferinde veritabanını çağırıyorsunuz featureve ayrıca context.SaveChanges()içine eklememelisiniz, foreachforeach döngüsünün dışında olmalıdır.
Jawand Singh

1
SQL, EF koduyla aynı değildir. SQL'de, tüm satırlarda çalışan ve tabloyu güncelleyen sadece 1 komuttur. EF kodu önce tüm satırları alır, değiştirilenleri DB'de günceller, yani 1000 güncellenmiş
satırınız varsa

1
@stom Hala aynı değil :) context.SaveChanges (); sadece güncellemenizi gönderir. Her biri Sıralama Sipariş koşulunu değil, kimliği kullanan 1000 güncelleme komutu olmaya devam edecek
Ashkan Sirous

2
@stom ExecuteSqlCommand bu amaç için EF'te var ama kabul ediyorum güzel değil :) Her neyse, benim amacım bir SQL komutu ve farklı bir EF-C # kodu yazıp bunların eşit olduğunu iddia etmenizdi. :)
Ashkan Sirous
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.