【问题标题】:Running a query over all entities in EF Core对 EF Core 中的所有实体运行查询
【发布时间】:2021-04-30 10:51:38
【问题描述】:

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

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 的情况下做到这一点?

【问题讨论】:

  • 如何删除我知道。但是您想在每个 DbSet 中更新什么?
  • @SvyatoslavDanyliv 实际用例是关于创建为用户预览的实体(并被标记为这样)。当用户完成后,他们可以决定应用预览并使其成为最终版本(更新预览标志)或将其扔掉(删除所有标记为预览的实体)。

标签: c# entity-framework-core ef-core-3.1


【解决方案1】:

我想出的更新实体的解决方案使用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);
    }
}

对于删除,我只需使用带有objectDbContext.RemoveDbContext.RemoveRange 方法。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2021-10-29
    相关资源
    最近更新 更多