有什么方法可以在模型中预定义一个查询,该查询只要从上下文中调用该模型就会运行
is there any way to pre-define a query in a model that runs whenever that model is called from context
我的 mvc 5 项目中有一个名为 operations 的模型。
public class Operation
{
public int OperationID { get; set; }
public string Name { get; set; }
public decimal Commission { get; set; }
public int DepartmentID { get; set; }
public bool CommissionValidity { get; set; }
public bool IsHidden { get; set; }
public decimal Capacity { get; set; }
public virtual Department Department { get; set; }
}
要求是每当从上下文中调用此模型时
如下图
Var db = new ApplicationDbContext();
var Operations = db.Operations.tolist();
我只想加载 IsHidden 字段为 False 的记录,而无需在查询中使用 where 子句
有没有像我创建构造函数或定义 getter Setter 函数那样的方法来实现目标。
如果您使用的是 Entity Framework 内核,则可以使用 global query filter 来实现。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Operation>().HasFilter(o => !o.IsHidden);
}
Entity Framework 6 没有查询过滤器。为此,您需要在 DbContext
上使用不同的 属性 到 return 您的可见实体:
public IQueryable<Operation> VisibleOperations
=> Set<Operation>().Where(o => !o.IsHidden);
但是,您将无法使用此筛选查询在数据库中添加或删除实体,因此您可能仍需要公开完整的 IDbSet<Operation>
,其中不包含已应用过滤器。
我的 mvc 5 项目中有一个名为 operations 的模型。
public class Operation
{
public int OperationID { get; set; }
public string Name { get; set; }
public decimal Commission { get; set; }
public int DepartmentID { get; set; }
public bool CommissionValidity { get; set; }
public bool IsHidden { get; set; }
public decimal Capacity { get; set; }
public virtual Department Department { get; set; }
}
要求是每当从上下文中调用此模型时 如下图
Var db = new ApplicationDbContext();
var Operations = db.Operations.tolist();
我只想加载 IsHidden 字段为 False 的记录,而无需在查询中使用 where 子句
有没有像我创建构造函数或定义 getter Setter 函数那样的方法来实现目标。
如果您使用的是 Entity Framework 内核,则可以使用 global query filter 来实现。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Operation>().HasFilter(o => !o.IsHidden);
}
Entity Framework 6 没有查询过滤器。为此,您需要在 DbContext
上使用不同的 属性 到 return 您的可见实体:
public IQueryable<Operation> VisibleOperations
=> Set<Operation>().Where(o => !o.IsHidden);
但是,您将无法使用此筛选查询在数据库中添加或删除实体,因此您可能仍需要公开完整的 IDbSet<Operation>
,其中不包含已应用过滤器。