如何使用LINQ创建泛型函数?

DiP*_*Pix 6 c# linq generics entity-framework

根据这里的信息.

我找到了如何使用Entity Framework删除孤儿.

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

    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何为这部分制作通用函数,因为它可能经常被使用:

context.ReportCards
        .Local
        .Where(r => r.Student == null)
        .ToList()
        .ForEach(r => context.ReportCards.Remove(r));
Run Code Online (Sandbox Code Playgroud)

我想过这样的事情:

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));
}
Run Code Online (Sandbox Code Playgroud)

但当然它不起作用.有什么建议?

Ser*_*kiy 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));
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它

context.ReportCards.RemoveOrphans(r => r.Student == null);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

您还可以使用简单的泛型方法,该方法接受IDbSet<TEntity>作为第一个参数,但它不会是可读的

RemoveOrphans(context.ReportCards, r => r.Student == null);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)