2009-08-12 28 views
13

Ben değerleri güncellemeniz gerekir ama bunu yapmak için bütün tabloları değerleri döngü ediyorum:Linq-To-SQL ile nasıl güncellenir?

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    foreach (var sample in db.Samples) 
    { 
     var matches = samples.Where(a => a.Id == sample.Id); 
     if(matches.Any()) 
     { 
      var match = matches.First(); 
      match.SomeColumn = sample.SomeColumn; 
     } 
    } 
    db.SubmitChanges(); 
} 

ben Yukarıdaki kod bunu yapmak için doğru bir yol değildir eminim, ama herhangi düşünemedim başka bir yol henüz. Daha iyi bir yol gösterebilir misin?

+0

Bağlı varlıkların bağlantısı kesilen varlıklardan güncellemeye çalışıyor musunuz? – Marc

+0

evet, bağlı varlıkların bağlantısı kesilmiş varlıklardan güncellemeye çalışıyorum –

cevap

24

Evet, daha basit bir yol var. Çok daha basit. Varlıklarınızı içeriğe eklerseniz ve ardından Yenile (KeepCurrentValues ​​seçiliyken), SQL'e Linq bu varlıkları sunucudan alır, karşılaştırır ve farklı olanları güncelleştirir. Kodun böyle bir şey görecekti. Bu durumda

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    db.Samples.AttachAll(samples); 
    db.Refresh(RefreshMode.KeepCurrentValues, samples) 
    db.SubmitChanges(); 
} 

, SQL Linq böylece sürece tuşları senkronize olduğu gibi, bir şeyin yok güncelleme kayıtlarını eşleştirmek ve anahtarlarını kullanıyor.

+1

Küçük anlamsal düzeltme, "onları güncel olarak işaretlemiyor". Ne yapar, her bir özelliğin "orijinal değeri", veritabanından okunan değerlerle değiştirilir. Her bir özelliğin "geçerli değeri" değişmediğinden, SubmitChanges, geçerli değerden (yönteme geçirilen) farklı olan (sunucudan okunan) bir orijinal değere sahip olan kayıtları güncellemeyi bilecektir. –

+3

FYI, bu yalnızca örnekler, veritabanında mevcut olanın bir alt kümesi olduğunda çalışır. İki varsayım var. 1. Numune numaranızda mevcut olan bu tablodaki hiç kimse kayıtlarını silmez. 2. Sonuç olarak, örnek koleksiyonunuz eklediğiniz yeni girişleri içeremez. – Marc

7

Linq2Sql (veya Linq to Varlıklar) ile, sunucudaki kayıtları ilk önce tam olarak almadan güncelleştirmenin bir yolu yoktur, bu nedenle yaptığınız şey aslında doğrudur.

Bundan kaçınmak isterseniz, istediğinizi yapan ve modelinize ekleyen bir saklı yordam yazın. Bu ancak sizin amaçlanan soru :) olsaydı

Ben tamamen emin değilim

*: SELECT ifadesini inşa etmek ve her nasılsa bir UPDATE içine çıkan SEÇME deyimini Kesecek kullanan LINQ çevresindeki bazı gardiyanlar vardır ama Tavsiye etmem.

İlgili konular