2011-08-25 15 views
7

SQL करने के लिए वहाँ LINQ के साथ एक संग्रह पर एक बहु-अपडेट करने के लिए एक तरीका है? वर्तमान में यदि मेरे पास List<myObject> है और मैं सूची में प्रत्येक पंक्ति के लिए कॉलम 1 को बराबर टेस्ट में अपडेट करना चाहता हूं, तो मैं एक फ़ोरैच लूप सेट अप करूंगा और फिर प्रत्येक व्यक्तिगत ऑब्जेक्ट के लिए मैं मान सेट करूंगा और फिर इसे सहेज दूंगा। यह ठीक काम करता है लेकिन मैं बस सोच रहा था कि वहाँ कुछ LINQ विधि थी जहां मैं myOject.BulkUpdate(columnName, value) जैसे कुछ कर सकता था? जैसे आप एसक्यूएल करने के लिए LINQ का उपयोग कर रहेLINQ के साथ बहु-अपडेट

+1

क्या आप LINQ-to-SQL के बारे में बात कर रहे हैं? –

+0

मैं हमेशा एक्सएमएल का उपयोग थोक डेटा के रूप में थोक अद्यतन करने के लिए संग्रहित प्रक्रियाओं में वापस लौटा, लेकिन यह जानना चाहूंगा कि LINQ में यह संभव है या नहीं। –

उत्तर

5

लगता है, और आप पहले से ही मिल गया है मूल बातें बाहर रखी। एसक्यूएल करने के लिए

LINQ वर्गों में टेबल सार संक्षेप के बारे में है, और वास्तव में या 'चांदी की गोली' एक लाइनर आप देख रहे हैं प्रदान नहीं करता है।

ऐसा करने के लिए एक ही रास्ता प्राप्त करने के लिए अपने एक लाइनर कि स्तंभ नाम और नया मान लेने के लिए एक संग्रहीत proc है, और उस तर्क अपने आप को लागू करने के लिए होगा।

db.MassUpdateTableColumn("Customer", "Name", "TEST"); 

.... 
CREATE PROC MassUpdateTableColumn 
    @TableName varchar(100), @ColumnName varchar(100), @NewVal varchar(100) 
AS 
    /*your dynamic SQL to update a table column with a new val. */ 

अन्यथा, यह के रूप में आप का वर्णन है:

List<Customer> myCusts = db.Customers.ToList(); 
foreach(Customer c in myCusts) 
{ 
    c.Name = "TEST"; 
}  
db.SubmitChanges(); 
+0

हाँ मैं समझता हूं कि यह कैसे करें। मेरा सवाल केवल यह पूछ रहा है कि कोई LINQ फ़ंक्शन है जो अधिक सुव्यवस्थित है। – esastincy

1

LINQ एसक्यूएल के लिए (या एफई उस बात के लिए), सब के बारे में स्मृति में वस्तुओं को लाने, उन्हें जोड़ तोड़ है, और फिर प्रत्येक पंक्ति के लिए अलग डेटाबेस अनुरोधों के साथ उन्हें अपडेट कर रहा है।

मामलों में जहां आप क्लाइंट पर संपूर्ण वस्तु हाइड्रेट करने की जरूरत नहीं है, यह बहुत सर्वर साइड परिचालन (संग्रहीत procs, TSQL) LINQ के बजाय का उपयोग करने के लिए बेहतर है। आप डेटाबेस के खिलाफ TSQL जारी करने के लिए LINQ प्रदाताओं का उपयोग कर सकते हैं। उदाहरण के लिए, LINQ से SQL के साथ आप संदर्भ का उपयोग कर सकते हैं। निष्पादित करें ("तालिका सेट फ़ील्ड = मान जहां स्थिति") अपडेट करें, बस SQL Injection के लिए देखें।

9

आपका आवश्यकता यहाँ Linq अभिव्यक्ति और इस विषय पर टेरी Aney उत्तम लाइब्रेरी का उपयोग पूरी तरह संभव है।

Batch Updates and Deletes with LINQ to SQL

उदाहरण आप इस प्रकार किया जाएगा दिया करने के मामले में एक अद्यतन:

using BTR.Core.Linq; 
... 

Context.myObjects.UpdateBatch 
(
    Context.myObjects.Where(x => x.columnName != value), 
    x => new myObject { columnName = value} 
); 

संपादित करें (2017/01/20): यह लायक कुछ भी नहीं है यह अब उपलब्ध है एक NuGet पैकेज के रूप में @https://www.nuget.org/packages/LinqPost/

Install-Package LinqPost 
+2

आरबीएआर से बचने के लिए उपरोक्त, पहला जवाब वास्तव में सही नहीं है। – Jasmine

संबंधित मुद्दे