对EF Core中的所有实体运行查询



我有一个所有实体的基类:

public abstract class Entity
{
int Id { get; set; }
bool Flagged { get; set; }
}
public class Foo : Entity
{
string Name { get; set; }
}
public class Bar : Entity
{
int Counter { get; set; }
}

我想找到Flagged设置为true的所有实体,然后修改它们或从数据库中删除它们。我如何做到这一点,而不手动检查每个衍生类型的每个DbSet?

我提出的更新实体的解决方案使用DbContext.Model.GetEntityTypes()来获得所有实体类型,MethodInfo.MakeGenericMethod来获得每个实体类型的DbSet。最后将它们转换为IQueryable<Entity>,这样我就可以在不知道DbSet的底层类型的情况下访问实体。

使用它,我创建了以下扩展方法:
public static IQueryable<Entity> GetEntityQuery(this DbContext context, Type entityType)
{
MethodInfo method = typeof(DbContext).GetMethod(nameof(DbContext.Set));
MethodInfo genericMethod = method.MakeGenericMethod(entityType);
var dbSet = genericMethod.Invoke(context, null);
return (IQueryable<Entity>)dbSet;
}
public static IEnumerable<IQueryable<Entity>> GetAllEntityQueries(this DbContext context)
{
foreach (var entityType in context.Model.GetEntityTypes())
{
yield return context.GetEntityQuery(entityType.ClrType);
}
}

对于删除,我简单地使用DbContext.RemoveDbContext.RemoveRange方法,它们接受一个object

最新更新