2017-01-30 8 views
6

here से जानकारी के आधार पर।LINQ का उपयोग कर सामान्य कार्य कैसे करें?

मैंने पाया कि एंटीटी फ्रेमवर्क के साथ अनाथ को कैसे हटाया जाए।

public void SaveChanges() 
{ 
    context.ReportCards 
     .Local 
     .Where(r => r.Student == null) 
     .ToList() 
     .ForEach(r => context.ReportCards.Remove(r)); 

    context.SaveChanges(); 
} 

मैं सोच रहा था कि कैसे इस हिस्से के लिए सामान्य समारोह बनाने के लिए, क्योंकि यह अक्सर इस्तेमाल किया जा सकता है:

context.ReportCards 
     .Local 
     .Where(r => r.Student == null) 
     .ToList() 
     .ForEach(r => context.ReportCards.Remove(r)); 

मैं कुछ इस तरह के बारे में सोचा:

public void SaveChanges() 
{ 
    RemoveOrphans(Student, ReportCards) 
    context.SaveChanges(); 
} 

private void RemoveOrphans<T>(T sourceContext, T orphan) 
{  
    context.orphan 
     .Local 
     .Where(r => r.sourceContext == null) 
     .ToList() 
     .ForEach(r => context.orphan 
     .Remove(r)); 
} 

लेकिन निश्चित रूप से यह काम नहीं करता कोई सलाह?

+0

के लिए 'Where' हिस्सा सिर्फ एक' Predicate' – TheLethalCoder

+0

में पास तुम शायद 'context.Set ' उपयोग करना चाहते हैं। – juharr

उत्तर

6

आप विस्तार विधि लिख सकते हैं जो एक ही करता है:

public static void RemoveOrphans<TEntity>(this IDbSet<TEntity> entities, 
    Func<TEntity, bool> orphanPredicate) 
    where TEntity: class 
{ 
    entities.Local.Where(orphanPredicate).ToList().ForEach(e => entities.Remove(e)); 
} 

और यह इस तरह से

context.ReportCards.RemoveOrphans(r => r.Student == null); 
context.SaveChanges(); 

तुम भी सरल सामान्य विधि है जो IDbSet<TEntity> पहले पैरामीटर के रूप में स्वीकार करता है का उपयोग कर सकते का उपयोग करें, लेकिन यह होगा ऐसा पठनीय

RemoveOrphans(context.ReportCards, r => r.Student == null); 
context.SaveChanges(); 
+0

'.ToList()' आलसी नहीं है। '.AsNumerable()' का उपयोग करना और 'foreach' लूप लिखें। – Oliver

+0

@ ओलिवर आपको उस मामले में 'अवैधऑपरेशन अपवाद' मिलेगा - आपको संग्रह को संशोधित करने की अनुमति नहीं है, जिसे –

+0

समझाया गया है, हां। तुम सही हो। – Oliver

1

ऐसा कुछ काम करना चाहिए:

private void RemoveOrphans<T>(Predicate<T> where) 
{ 
    var items = context.Set<T>().Where(where).ToList(); 
    if (items != null) 
    { 
     foreach (var item in items) 
     { 
      context.Set<T>().Remove(item); 
     } 
    } 
    context.SaveChanges(); 
} 

उपयोग:

RemoveOrphans<ReportCards>(r => r.Student == null); 
+0

'आइटम' कभी भी 'शून्य' (लेकिन खाली नहीं) हो सकता है। तो शून्य जांच की जरूरत नहीं है। – Oliver

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