2017-01-30 4 views
6

hereの情報に基づいています。LINQを使用して汎用関数を作成する方法は?

Entity Frameworkで孤児を削除する方法が見つかりました。

私はそれが頻繁に使用される可能性があるため、この部分のための汎用関数を作る方法を思っていた
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'部分についてだけであなたはおそらく' context.Set を '使いたい – TheLethalCoder

+0

' Predicate'に渡します。 – 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)); 
} 

そしてそれをあなたはまた、最初のパラメータとしてIDbSet<TEntity>を受け入れ、単純な汎用的な方法を使用することができます

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

この方法を使用するが、それは意志そんなに可読ではない

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

'.ToList()'はレイジーではありません。 '.AsEnumerable()'を使って 'foreach'ループを書く。 – Oliver

+0

@Oliverその場合は 'InvalidOperationException'が返されます - あなたは列挙されたコレクションを変更することができません –

+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

'items'は決して' null'(ただし空です)にすることはできません。したがって、ヌルチェックは必要ありません。 – Oliver

関連する問題