आईडी की सूची से इकाई रूपरेखा में कई पंक्तियों को अपडेट करें


94

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

SQL में उदाहरण:

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

मैं उपरोक्त को इकाई ढांचे में कैसे परिवर्तित करूं?


आपका डेटाबेस प्लेटफ़ॉर्म ओरेकल mysql क्या है ..
zee

मेरा डेटाबेस Microsoft SQL
allencoded

इसकी अनुमति देने वाले दो ओपन सोर्स प्रोजेक्ट हैं: EntityFramework.Extended और E ntity फ्रेमवर्क एक्सटेंशन
पीटर केर

जवाबों:


165

नीचे जैसा कुछ

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

अपडेट करें:

आप नीचे के रूप में कई फ़ील्ड अपडेट कर सकते हैं

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

क्या मैं आपके द्वारा भेजे गए फॉर्च में एक से अधिक फ़ील्ड अपडेट कर सकता हूं, जिसके लिए मैंने पूछा था कि वास्तव में क्या है। यदि आप अधिक कर सकते हैं तो बस उत्सुक? इसके अलावा SubmitChanges काफी काम करता है की तरह नहीं दिखता है। मैं नवीनतम इकाई ढांचे का उपयोग कर रहा हूं। शायद SaveChanges ()?
allencoded

10
ForEachएक तरीका है List, और यह आमतौर पर उपयोग करने के लिए हतोत्साहित किया जाता है क्योंकि यह प्रोग्रामिंग का बहुत कार्यात्मक तरीका नहीं है। बस foreach (ऑपरेटर) एक सामान्य व्यक्ति की तरह उपयोग करें ।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

55
इस समाधान का उपयोग सूची में प्रत्येक तत्व के लिए एक अद्यतन क्वेरी उत्पन्न करता है। क्या ईएफ़ प्राप्त करने का एक तरीका है जैसे प्रश्न में केवल एक क्वेरी करना? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
रामनो

19
ज्ञात हो कि डेटाबेस परिप्रेक्ष्य से इस बारे में जाने के लिए यह एक बहुत ही अक्षम तरीका है। यह न केवल फ्रेंड्स टेबल से हर पंक्ति को शामिल करने वाला एक बड़ा चयन स्टेटमेंट जारी करता है, बल्कि यह अद्यतन किए गए प्रत्येक रिकॉर्ड के लिए एक अलग अद्यतन आदेश जारी करता है। इसलिए एक आदेश जारी करने के बजाय आप संभावित रूप से कई आदेशों के साथ-साथ अपने डेटाबेस से डेटा का एक गुच्छा स्ट्रीमिंग कर रहे हैं।
d512 23

1
@ShekharPankaj, मूल रूप से आप जो करना चाहते हैं, वह "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4) जैसी SQL कमांड जारी करना है।" मुझे नहीं लगता कि EF को ऐसा करने के लिए प्रत्यक्ष समर्थन प्राप्त है। मेरा मानना ​​है कि इस के लिए कुछ 3 पार्टी समाधान हैं ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) लेकिन मैंने उनका उपयोग नहीं किया है। अन्य विकल्प EF के बजाय कच्चे ADO.NET का उपयोग करना है।
d512

0
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";
}

आप अपनी स्थिति को पूरा करने वाले प्रत्येक तत्व को अपडेट करने के लिए foreach का उपयोग कर सकते हैं।

यहाँ एक और अधिक सामान्य तरीके से एक उदाहरण दिया गया है:

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

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

सामान्य तौर पर, आप सबसे अधिक db प्रश्नों के इंतजार के साथ async विधियों का उपयोग करेंगे।


मैं यह नहीं देखता कि यह मौजूदा उत्तर में कुछ कैसे जोड़ता है। यह मूल रूप से इसे दोहराता है।
गर्ट अर्नोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.