2009-05-15 19 views
17

LINQ के साथ एक बार में कई रिकॉर्ड निकालने का सबसे अच्छा तरीका क्या है?LINQ क्वेरी में एकाधिक रिकॉर्ड हटाने का सबसे अच्छा तरीका?

+1

यदि आपको कुछ कहां से हटाना है ... 'तो SQL का उपयोग करने पर विचार करें। LINQ इस नौकरी के लिए सबसे अच्छा उपकरण नहीं हो सकता है। – Myster

उत्तर

23

Linq2Sql

 
CustomerDataContext ctx = new CustomerDataContext("connection string"); 
var customers = ctx.Customers.Where(c => c.Name == "david"); 

ctx.Customers.DeleteAllOnSubmit(customers); 
ctx.SubmitChanges(); 
+3

यह सबसे आसान तरीकों में से एक है लेकिन मैं नहीं कहूंगा कि सबसे कुशल है। वास्तव में कोई अनुकूलन नहीं किया जा रहा है। जेनरेट एसक्यूएल आपकी क्वेरी से मेल खाने वाली सभी ऑब्जेक्ट्स को बताता है, फिर उन्हें हटाने के लिए मैन्युअल रूप से पुन: सक्रिय करता है। इस पोस्ट को देखें - http://stackoverflow.com/questions/869209/bulk-deleting-via-linq – David

+0

यदि आप LINQ से SQL का उपयोग नहीं कर रहे हैं तो http://stackoverflow.com/q/1781175/24267 – mhenry1384

+0

देखें निश्चित रूप से प्रकार 'System.Linq.IQueryable ' को 'राजरंगडाटा.tblRelatedProduct' में परिवर्तित नहीं कर सकता। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं? – rahularyansharma

2

पीछा कर रहा है करने के लिए LINQ के लिए और अधिक संस्थाओं के साथ रिकॉर्ड को हटाने के लिए है, लेकिन यह मदद मिल सकती है:

Bulk-deleting in LINQ to Entities

1

शायद अपने से थोड़ा इस उत्तर लेकिन आज के लिए देर से मैं अपने आप को मांग मैं इस में पड़ गए और मैं इस समाधान

CustomerDataContext ctx = new CustomerDataContext("connection string"); 

ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david")); 

ctx.SubmitChanges(); 
+4

जैसा ही होगा, निश्चित रूप से आप उस समाधान के साथ 'आने' का दावा नहीं कर सकते जब आपने जो कुछ किया था, वह 'DeleteAllOnSubmit' विधि के सबसे लोकप्रिय उत्तर से' cust' की घोषणा को स्थानांतरित कर दिया गया था। – Sheridan

0

मैं खुर्रम के साथ सहमत के साथ आया था, यह एक साधारण संग्रहीत प्रक्रिया के साथ यह करने के लिए और अधिक कुशल है LINQ के साथ (बशर्ते आपके पास ऐसा करने के लिए एसक्यूएल में पर्याप्त अनुमतियां हों)। मैं इसे एक उदाहरण के साथ बढ़ा दूंगा।

संग्रहीत प्रक्रिया: तरीकों पर डेटाबेस अन्वेषक से

CREATE PROCEDURE [dbo].[RemovePermissionsFromRole] 
(
    @ROLE_ID int 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM [RolePermissions] WHERE [RoleID] = @ROLE_ID; 
END 

खींचें संग्रहीत प्रक्रिया अपने dbml फ़ाइल में फलक। फ़ाइल सहेजें। और कोड में:

if (Request.QueryString["RoleID"] != null) { 
    int roleID = Convert.ToInt32(Request.QueryString["RoleID"]); 

    SETSDataContext context = new SETSDataContext(); 
    context.RemovePermissionsFromRole(roleID); 
} 
1

एकल आधार पर इकाई की रूपरेखा 6

// Database context 
EntitiesContext db = new EntitiesContext(connString); 
// Select all the records to be deleted 
IEnumerable<entity> list = db.entity.where(x=>x.id == id).toList(); 
// Use Remove Range function to delete all records at once 
db.entity.RemoveRange(list); 
// Save changes 
db.SaveChanges(); 
2

कई रिकॉर्ड निकाला जा रहा है का उपयोग करते हुए जहां खंड

context.EntityModel 
      .RemoveAll(r => r.property == "propertyEntered"); 

लेकिन क्या आप भी डेटाबेस है कि नहीं है से रिकॉर्ड निकालें सकता है List<ListOfBadRecords>

context.EntityModel 
      .Where(w => w.propertyID == ID).ToList() 
      .RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID)); 
में मौजूद है

संपादित करें:

अनिश्चित जो तेज है, लेकिन आप यह भी

.RemoveAll(r => !ListOfBadRecords.Select(s=>s.propertyID).Contains(w.propertyID))

EDIT2 साथ 2 क्वेरी कर सकता है: context.SaveChanges(); मत भूलना के रूप में मैं पहले मसौदे में किया था

0

यहाँ क्या मैंने समस्या हल की है:

 try 
     { 
      List<MaterialPartSerialNumber> list = db.MaterialPartSerialNumbers.Where(s => s.PartId == PartId && s.InventoryLocationId == NewInventoryLocationId && s.LocationId == LocationId).ToList(); 
      db.MaterialPartSerialNumbers.RemoveRange(list); 
      db.SaveChanges(); 
     } 
     catch(Exception ex) 
     { 
      string error = ex.Message; 
     } 

सबसे पहले, आप एक सूची पा सकते हैं उन वस्तुओं को जिन्हें आप हटाना चाहते हैं।

फिर, आप RemoveRange(**list_of_item_to_delete**) फ़ंक्शन का उपयोग कर सकते हैं ताकि यह डेटाबेस में मौजूद सूची में प्रत्येक उदाहरण को हटा दे।

एमएसडीएन के अनुसार, विधि सूची से तत्वों की एक श्रृंखला को हटा देती है।

अधिक जानकारी के लिए इसे यहाँ पहली तालिका जहां हटा दिया जाना चाहिए रहे हैं रिकॉर्ड है, तो बस RemoveRange उपयोग करते हैं, और अंत में बस में परिवर्तन सहेजने के हैं की एक IEnumerable वस्तु बनाने की जाँच https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

+1

कृपया यह बताएं कि यह क्यों काम करता है कोड को उत्तर के रूप में पोस्ट न करें –

0

यह मैं क्या उपयोग किया जाता है, डेटाबेस। आइए मान लें कि आप उत्पाद तालिका पर एक विशिष्ट सप्लायर आईडी से सभी उत्पादों को हटाना चाहते हैं, इस तरह आप इसे कैसे कर सकते हैं।

आईन्यूमेरेबल प्रोडक्ट्स टोरोमव = डीबी.प्रोडक्ट्स। (X => x.SupplierId == प्रदायक); db.Products.RemoveRange (ProductsToRemove); db.SaveChanges();

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