在 C# 中,是否有将 DBSet 传递给方法的通用方法?

In C#, is there a generic way to pass a DBSet to a method?

我目前有以下工作代码:

        private Converter RemoveAll<T>(List<T> databaseSet) {
             databaseSet
                .ForEach(item =>  this.myContext.Remove(item));
            return this;
        }

我可以这样调用:

this.RemoveAll(this.myContext.Widgets.ToList());
this.RemoveAll(this.myContext.WhositsWhatsits.ToList());
// etc.

其中 this.myContext 是扩展 DbContextMyContext 的实例;和 WidgetsWhositsWhatsits 等都是 DbSet.

的实例

因为我总是需要将 DbSet 更改为 List,所以我宁愿将 DbSet 作为参数传递,例如:

this.RemoveAll(this.myContext.Widgets);
this.RemoveAll(this.myContext.WhositsWhatsits);
// etc.

但是如果我将方法更改为:

        private Converter RemoveAll<T>(DbSet<T> databaseSet) {
             databaseSet.ToList()
                .ForEach(item =>  this.myContext.Remove(item));
            return this;
        }

编译器抱怨“类型 'T' 必须是引用类型才能将其用作泛型类型或方法 'DbSet' 中的参数 'TEntity'。

是否可以修改此方法,以便在调用它之前无需调用 ToList()?

DbSet 仅限于将引用类型作为泛型参数。因此,您需要限制您的方法也只适用于引用类型。可以通过使用 where 子句来实现,如下所示。

private Converter RemoveAll<TEntity>(DbSet<TEntity> databaseSet) where TEntity : class

不使用 remove 方法,而是使用 removerange,这样可以避免调用 ToList()。我提供了一种扩展方法,可以进一步减少代码。

public static class DbContextExtension
{
    public static void RemoveAll<Tinput>(this DbSet<Tinput> dbset) where Tinput : class
    {
        dbset.RemoveRange(dbset);
    }
}

用法会像。

 this.myContext.Widgets.RemoveAll();

如果您不需要扩展方法,只需使用

dbset.RemoveRange(dbset);