2008-12-03 22 views
17

के साथ इकाई (आईडी द्वारा) हटाएं मैं अब कुछ समय के लिए LINQ से SQL के साथ काम कर रहा हूं और जब डीबी से किसी इकाई को निकालने की बात आती है, तो मैंने हमेशा तालिका को बुलाया है। हटाएंऑन सबमिट करें और इकाई में पारित करें। कभी-कभी मैंने खुद को कुछ लिखना पाया है:LINQ से SQL: एक क्वेरी

db.Users.DeleteOnSubmit(db.Users.Where(c => c.ID == xyz).Select(c => c).Single()); 

यह निश्चित रूप से दो प्रश्नों का कारण बनता है। एक इकाई को मानदंड से मेल खाता है और फिर इसे हटाने के लिए दूसरा। अक्सर मेरे पास रिकॉर्ड की आईडी है जिसे मुझे हटाने की आवश्यकता है और मैं सोच रहा हूं कि आईडी के माध्यम से किसी तालिका से पंक्ति को निकालने का एक और सीधा तरीका है या नहीं?

उत्तर

0

मैं जैसे वाक्य रचना के साथ, LINQ एसक्यूएल में मूल रूप से यह कर सकते हैं, हालांकि एक संग्रहीत प्रक्रिया लिख ​​आप देना होगा कि आप क्या चाहते विश्वास नहीं करते:

db.spDeleteUserById(id); 

यह प्रत्येक तालिका के लिए एक संग्रहीत प्रक्रिया लिख ​​requre हैं , लेकिन यह एसक्यूएल की एक बहुत छोटी राशि है।


बाहर चेक this blog post, जिसमें लेखक एक विस्तार विधि है कि अपनी ही नष्ट बयान उत्पन्न बनाया गया है। आप इस अवधारणा को लेने में सक्षम हो सकते हैं और एक डिलीट दिनचर्या बनाने के लिए इसके साथ चल सकते हैं जिसे चयन की आवश्यकता नहीं होती है। नकारात्मकता यह है कि आप एक विस्तार विधि के साथ समाप्त हो सकते हैं जो आपकी अपनी स्कीमा के लिए विशिष्ट है।

मैं समझता हूं कि आप अपने तर्क को डेटाबेस परत से बाहर रखना चाहते हैं, लेकिन इस मामले में मुझे लगता है कि संग्रहित प्रो रूट जाने के लिए यह बहुत आसान होगा। यह कड़े युग्मित डेटा एक्सेस तर्क के साथ समस्याओं के अधीन नहीं होगा, क्योंकि आईडी द्वारा पंक्ति को हटाने से कभी भी रिफैक्टरिंग की आवश्यकता नहीं होती है।

6

यहाँ एक समाधान है ...

public static void DeleteByPK<TSource, TPK>(TPK pk, DataContext dc) 
    where TSource : class 
{ 
    Table<TSource> table = dc.GetTable<TSource>(); 
    TableDef tableDef = GetTableDef<TSource>(); 

    dc.ExecuteCommand("DELETE FROM [" + tableDef.TableName 
    + "] WHERE [" = tableDef.PKFieldName + "] = {0}", pk); 
} 

यह मेरा कोड नहीं है! व्याख्या के लिए देखें - http://msmvps.com/blogs/omar/archive/2008/10/30/linq-to-sql-delete-an-entity-using-primary-key-only.aspx

उम्मीद है कि इससे मदद मिलती है।

+0

आप DeleteCyPK को DataContext पर एक एक्सटेंशन विधि भी बना सकते हैं और स्ट्रिंग स्वयं को पैरामीटरयुक्त क्वेरी (exec sp_executesql ...) होना चाहिए। एक लिंक 2 एसक्यूएल कथन पर लाइन एसक्यूएल में –

+7

उद्देश्य –

+3

@ बॉबी को हराता है: वास्तव में नहीं।मैं प्रदर्शन के लिए लाइन एसक्यूएल में उपयोग करता हूं और जब आवश्यक (जटिल एसक्यूएल)। सामान्य संचालन के लिए एसक्यूएल पीढ़ी पर आराम करें। –

0

मैं निम्नलिखित विस्तार तरीकों उपयोग किया जा रहा है उपयोग कर रहा हूँ:

context.Customers.DeleteEntity(c => c.CustomerId, 12); 

public static class EntityExtensions 
{ 
    public static EntityKey CreateEntityKey<T, TId>(this ObjectSet<T> entitySet, Expression<Func<T, TId>> entityKey, TId id) 
     where T : class 
    { 
     var qEntitySet = entitySet.Context.DefaultContainerName + "." + entitySet.EntitySet.Name; 
     var keyName = LinqHelper.PropertyName(entityKey); 

     return new EntityKey(qEntitySet, keyName, id); 
    } 

    public static void DeleteEntity<T, TId>(this ObjectSet<T> entitySet, Expression<Func<T, TId>> entityKey, TId id) 
     where T : EntityObject, new() 
    { 
     var key = CreateEntityKey(entitySet, entityKey, id); 

     var entityInstance = new T {EntityKey = key}; 

     var propertyName = LinqHelper.PropertyName(entityKey); 
     var property = typeof (T).GetProperty(propertyName); 
     if (property == null) 
      throw new Exception("Property name " + propertyName + " does not exist on " + typeof(T).Name); 
     property.SetValue(entityInstance, id, null); 

     entitySet.Attach(entityInstance); 
     entitySet.DeleteObject(entityInstance); 
    } 
0

मैं जानता हूँ कि इस सवाल का वर्ष है, लेकिन यहाँ एक नए और (IMO) बेहतर समाधान है।
मैं उसी चीज को पूरा करने की कोशिश कर रहा था जब मैं PLINQO पर दौड़ गया। LINQ में एक्सटेंशन का बहुत अच्छा सेट। This page वर्णन करता है कि PLINQO के एक्सटेंशन विधियों के साथ हटाए जाने के तरीके को किस प्रकार डीबी सर्वर पर केवल 1 राउंडट्रिप की आवश्यकता होती है।
नकारात्मकता यह है कि इसे चलाने के लिए Codesmith की आवश्यकता होती है, जो कि थोड़ा महंगा है।

4

एक आंशिक वस्तु संलग्न और इसे हटाकर बिना हाथ टूलींग एसक्यूएल यह करें:

var myEntity = new MyEntityType { MyEntityId = xxx }; 
Context.MyEntityTypeTable.Attach(myEntity, false); 
Context.MyEntityTypeTable.DeleteOnSubmit(myEntity); 
Context.SubmitChanges(); 

आसान। आप इसे एक विस्तार विधि के रूप में भी लिख सकते हैं और कुंजी का प्रतिनिधित्व करने के लिए गतिशील ऑब्जेक्ट प्रकार का उपयोग कर सकते हैं, और मुख्य गुणों को समझने के लिए प्रतिबिंब का उपयोग कर सकते हैं, जिसे मैं पाठक के लिए एक मजेदार अभ्यास के रूप में छोड़ दूंगा। जैसे Context.Delete लागू करें (नया {MyEntityId = xxx});