2010-06-02 35 views
5

Yaklaşık 100 güncelleştirme bildirimi oluşturan bu eski LINQ-SQL kodunu yeniden hesaplarken yardıma ihtiyacım var.LINQ-SQL Tek bir işlemde birden çok Satır Güncelleştirme

En iyi çözüm ile uğraşmaya devam edeceğim, ancak bu konuyla ilgili bazı fikirleri/geçmiş deneyimleri takdir edeceğim.

İşte benim kod:

List<Foo> foos; 
int userId = 123; 

using (DataClassesDataContext db = new FooDatabase()) 
{ 
    foos = (from f in db.FooBars 
      where f.UserId = userId 
      select f).ToList(); 

    foreach (FooBar fooBar in foos) 
    { 
     fooBar.IsFoo = false; 
    } 

    db.SubmitChanges() 
} 

Esasen ben belirli UserId değere sahip tüm kayıtlar için false IsFoo alanını güncellemek istiyorum.

oluyor nedir .ToList(), daha sonra her Foo nesnesi için, belirli bir kullanıcı için tüm FooBars almak için bir sorgu kapalı tetiklendiğini onun IsFoo özelliği güncellenirken bir UPDATE ifadesinin yürütülmesini olduğunu.

Yukarıdaki kod bir tek UPDATE deyimiyle yeniden faktörlendirilebilir mi?

İdeal olarak, ateş istediğim tek bir SQL aşağıdaki gibidir:

UPDATE FooBars 
SET IsFoo = FALSE 
WHERE UserId = 123 

DÜZENLEME o db.ExecuteCommand kullanmadan yapılmış olamaz gibi Tamam

yüzden görünüyor.

Grr ...!

Sonunda yapmam gereken şey, DLINQ ad alanı için başka bir uzantı yöntemi oluşturmaktır. Yine de bazı sabit kodlama (yani "WHERE" ve "UPDATE" yazıyor) gerektirir, ancak en azından uygulama ayrıntılarının çoğunu gerçek LINQ sorgu sözdiziminden gizler.

+0

Bunu tek bir işlemde yapabileceğinizi düşünmüyorum. – VoodooChild

cevap

2

Verileri Kontrol Et DataClassesDataContext.ExecuteCommand ...

+0

Bunun bazı örneklerini gördüm - ancak SQL'in bir string olarak "hardcoding" ve bunu ExecuteCommand yöntemine ileten bir şey içermiyor mu? LINQ-SQL'in tüm noktasını, veritabanının altta yatan ayrıntılarını soyutlamak olduğunu düşünmüştüm. – RPM1984

+0

Haklısınız. Buradaki tek sebep performans. Uygulamanıza tüm verileri almanıza gerek yok ve sadece basit güncelleme için geri dönün. Eğer 100'den fazla varlığınız varsa, fark çok büyük olacaktır ... – Marko

+0

Evet - gitmenin tek yolu. Bu sorunun EF'de de var olduğunu görmekten üzüldüm. – RPM1984

İlgili konular