linq to sql का उपयोग करते हुए एक समय में कई पंक्तियों को कैसे अपडेट करें?


91

तालिका:

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

यदि उपयोगकर्ता userid = 1, मित्र = 2,4,5 स्थिति = सत्य भेजता है

कृपया मुझे बताएं कि उपरोक्त सभी फ्रेंड्स स्थिति को कैसे अपडेट किया जाए, यह सच है। [एक समय में 2,3,4]।?

धन्यवाद

जवाबों:


233

एक कॉलम को अपडेट करने के लिए यहां कुछ सिंटैक्स विकल्प दिए गए हैं:

विकल्प 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();
}

विकल्प 2

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

     db.SubmitChanges();
}

विकल्प 3

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

अपडेट करें

जैसा कि टिप्पणी में अनुरोध किया गया है, यह दिखाने के लिए समझ में आ सकता है कि कई कॉलमों को कैसे अपडेट किया जाए। तो चलिए इस अभ्यास के उद्देश्य के लिए कहते हैं कि हम केवल statusलोगों को अपडेट नहीं करना चाहते हैं। हम अपडेट करना चाहते हैं nameऔर मिलान statusकहां friendidहै। इसके लिए कुछ सिंटैक्स विकल्प दिए गए हैं:

विकल्प 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();
}

विकल्प 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

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

अपडेट २

उत्तर में मैं SQL को LINQ और उस स्थिति में डेटाबेस का उपयोग करने के लिए उपयोग कर रहा था:

db.SubmitChanges();

लेकिन एंटिटी फ्रेमवर्क के लिए यह परिवर्तन करना है:

db.SaveChanges()

6
और कई टिप्पणियों के लिए आपको करने की आवश्यकता है:records.ForEach(x=> { x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });
जॉन

2
यह नहीं होना चाहिए db.SaveChanges()और नहीं db.SubmitChanges()?
bradlis7 15

3
... आपके तीनों विकल्प समान हैं। वास्तव में पहले दो के बीच एकमात्र अंतर यह है कि एक चर का उपयोग करता है और एक नहीं करता है। दोनों होने से सिर्फ शोर बढ़ता है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

3
क्या यह बिना संभव है ToList()? यह एक हत्यारा है
टूलकिट

2
क्या ToList () डेटाबेस से सभी रिकॉर्ड प्राप्त करता है, शर्त के अनुसार, है ना? यदि यह सही है, तो यह वास्तव में खराब प्रदर्शन होगा, क्या होगा यदि लाखों रिकॉर्ड हैं, हम उन्हें इस फ़ंक्शन को संचालित करने के लिए मेमोरी में लोड करते हैं? अगर मुझसे गलती हुई है तो कृपया मुझे सुधारें।
जैकब

20

ToList()स्वीकार किए गए उत्तर में विधि का उपयोग करें !

SQL प्रोफाइलर चल रहा है, मैंने सत्यापित किया और पाया कि ToList()फ़ंक्शन डेटाबेस से सभी रिकॉर्ड प्राप्त करता है। यह वास्तव में बुरा प्रदर्शन है !!

मैं इस प्रश्न को शुद्ध sql कमांड द्वारा निम्न प्रकार से चलाऊंगा:

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

यह एक पंक्ति का चयन किए बिना एक-शॉट में अपडेट को संचालित करेगा।


3

यह जो मैंने किया है:

एफई:

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

आशा किसी की मदद करती है।


एक जादू की तरह काम करता है!
यू यांग जियान

4
यह बुरा है, आप रिकॉर्ड प्राप्त करने के लिए हर बार डेटाबेस को कॉल कर रहे हैं featureऔर साथ ही आपको इसे context.SaveChanges()अंदर नहीं जोड़ना foreachचाहिए यह फॉरच लूप से बाहर होना चाहिए।
जवान सिंह

1
SQL EF कोड के समान नहीं है। SQL में यह सिर्फ 1 कमांड है जो सभी पंक्तियों पर चलता है और टेबल को अपडेट करता है। EF कोड पहले सभी पंक्तियों को लेता है, DB पर परिवर्तित लोगों को अपडेट करता है, जिसका अर्थ है कि यदि आपके पास 1000 अद्यतन पंक्तियाँ हैं, तो यह 1000 sql अपडेट निष्पादित करेगा
Ashkan Sirous

1
@stom यह अभी भी समान नहीं है :) संदर्भ ।aveChanges (); बस आपके अपडेट को सबमिट करता है। अब भी आईडी का उपयोग करते हुए प्रत्येक में 1000 अपडेट कमांड होंगे और
सॉर्टऑर्डर की

2
@stom ExecuteSqlCommand EF पर इस उद्देश्य के लिए मौजूद है, लेकिन मैं मानता हूं कि यह बहुत अच्छा नहीं है :) वैसे भी, मेरी बात यह थी कि आपने SQL कमांड और एक अलग EF-C # कोड लिखा है और दावा किया है कि वे समान हैं। :)
अश्कण सिरस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.