在 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
是扩展 DbContext
的 MyContext
的实例;和 Widgets
、WhositsWhatsits
等都是 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);
我目前有以下工作代码:
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
是扩展 DbContext
的 MyContext
的实例;和 Widgets
、WhositsWhatsits
等都是 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);