2011-01-09 10 views
18

जमा करें LINQ में, मैं कर सकता है:इकाई की रूपरेखा को हटाएँ सभी पर एसक्यूएल को

context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId)); 

क्या इकाई की रूपरेखा के लिए इस के बराबर?

+0

की डुप्लीकेट http://stackoverflow.com/ प्रश्न/86920 9/थोक-हटाना-इन-लिनक-टू-एंटिटीज? lq = 1 – surfen

उत्तर

5

@Femaref सही विचार है, लेकिन L2E के DeleteAllOnSubmit लिए एक सच्चे एनालॉग के लिए, आप अपने विस्तार विधि बनाने के लिए संस्थाओं की एक प्रति की गणना ताकि आप हो "संग्रह संशोधित नहीं है इससे पहले कि हटाया जा रहा है चाहता हूँ जबकि अपवाद "अंकन।

public static void DeleteAllObjects<TEntity>(this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class { 
    foreach(var entity in data.ToList()) //data.ToList() makes a copy of data for safe enumeration 
     set.DeleteObject(entity); 
} 
+1

यह स्वीकार्य उत्तर के साथ मेरी समस्या थी। हालांकि पूरे सेट को मेमोरी में खींचने से कहीं अधिक कुशल तरीका है? – Eric

+1

@Eric - आउट ऑफ़ द बॉक्स, आपको इनलाइन एसक्यूएल someway का उपयोग कर एक कस्टम समाधान का सहारा लेना होगा, लेकिन मैंने –

+1

जैसे कुछ भी कोशिश नहीं की है या केवल डेटा के माध्यम से पुन: उपयोग करें: 'के लिए (int i = data.Count() - 1; i> = 0; i--) set.DeleteObject (data.ElementAt (i)); ' – Jimbo

24
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId)) 
{ 
    context.User_Roles.DeleteObject(entity); 
} 
context.SaveChanges(); 

बेशक, आप एक विस्तार विधि लिख सकते हैं, जो इसे समाहित करेगा।

public static void DeleteObjects<TEntity> (this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class 
{ 
    foreach(var entity in data) 
    set.DeleteObject(entity); 
} 

की तरह कहा जाता है:

context.User_Roles.DeleteObjects(context.User_Roles.Where(ur => ur.UserId == user.UserId)) 
context.SaveChanges(); 
+1

+1: मैं बस इस कोड को बिल्कुल लिख रहा था। –

+0

आप इस विधि का उपयोग कर इस समस्या में भाग ले सकते हैं, इससे मदद मिलनी चाहिए: http://stackoverflow.com/a/3742340/183174 – LostNomad311

+0

@ nomad311 आप जिस मुद्दे का उल्लेख करते हैं वह वास्तव में क्या है? – surfen

2
foreach(var entity in context.User_Roles.Where(ur => ur.UserId == user.UserId)) 
{ 
    context.User_Roles.DeleteObject(entity); 
} 
context.SaveChanges(); 
निश्चित रूप से

, इस समाधान काम कर सकते हैं

यह कुछ इस तरह होगा। लेकिन, यह सबसे अक्षम समाधान है। यह समाधान प्रत्येक रिकॉर्ड (इकाई) के लिए एक SQL SQL कमांड उत्पन्न करेगा। इमेजिंग कि आप वर्ष 2000 से पहले सभी डेटा हटाना चाहते हैं। डेटाबेस में 1,000,000 से अधिक रिकॉर्ड हैं। यदि इन ऑब्जेक्ट्स को इस तरह से हटाएं, तो 1,000,000 से अधिक SQL कमांड सर्वर पर भेजे जाएंगे, यह एक अनावश्यक बड़ा अपशिष्ट है। क्या

+1

आपका जवाब अधूरा लग रहा है। एक वैकल्पिक, अधिक कुशल दृष्टिकोण क्या होगा? – surfen

+0

मैंने आपके कोड को सावधानी से नहीं पढ़ा। लेकिन, आप क्यों कहते हैं "सबमिट पर सभी हटाएं"? आपका मतलब "ऑल" क्या है?
यदि आप 2000 से अधिक पंक्तियों या उससे भी अधिक तालिका में सभी डेटा को हटाना चाहते हैं, तो आपको ऊपर दिए गए उत्तरों के बजाय हटाए गए कथन का उपयोग करना होगा। दक्षता पर विचार करने के लिए। – Jerry

+3

यह असंभव है कि किसी के पास एक ही उपयोगकर्ता आईडी के साथ बहुत से उपयोगकर्ता होंगे (यह प्राथमिक कुंजी होना चाहिए और इस उपयोगकर्ता आईडी के साथ केवल एक उपयोगकर्ता होगा)।हालांकि, मैं सहमत हूं कि बड़ी संख्या में इकाइयों के लिए तेजी से समाधान हैं, जैसे ** ExecuteStoreCommand ** http://stackoverflow.com/questions/869209/bulk-deleting-in-linq-to-entities – surfen

0

वहाँ इकाई की रूपरेखा में कोई RemoveAll बराबर है, तो आप स्मृति में निकाय लोड और DeleteObject विधि का उपयोग कर एक एक करके उन्हें एक को दूर कर सकते हैं।

आप लिंक का उपयोग कर सकते हैं: context.MyEntitie.RemoveAll (context.MyEntitie);

0

उपयोग EntityFramework.Extensions
EntityFramework.Extensions 1) सबसे पहले स्थापित NuGet

2 का प्रयोग करके) यहाँ Linq2Sql के DeleteAllOnSubmit() के लिए कोड समान है:

using EntityFramework.Extensions; 

.... 
public void DeleteAllUsers(User_Role user){ 
    context.User_Roles.Delete(ur => ur.UserId == user.UserId); 
    context.SaveChanges(); 
} 
... 
+0

यदि आप ur.UserID == user.UserId जैसे तर्क को पास करते हैं बूल, आप सिर्फ 'सत्य' मान क्यों नहीं देते ;-) इतना क्लीनर, वैसे भी, यह हमेशा एक एंटीपाटर होगा। – mikus

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