是否可以为Linq-to-SQL类生成的每个SQL语句添加一个default where子句?
我有一个带有Customer类的自定义DataContext。 Customer类有一个Deleted属性,每当我查询表时,我都希望它始终是NULL
。
例如,我可以写:
List<Customer> customers = db.Customers.ToList<Customer>();
但真的得到:
List<Customer> customers = db.Customers.Where(o => o.Deleted == null).ToList<Customer>();
我想在我的数据库中维护“已删除”的数据,但永远不需要在我的.NET代码中看到它。这种默认设置很方便,所以我不必记得为每个查询添加过滤器。
答案 0 :(得分:4)
您可以添加一个名为ActiveCustomers
的新属性,该属性将返回:
public IQueryable<Customer> ActiveCustomers {
get { return db.Customers.Where(e => e.Deleted == null); }
}
对该属性的任何查询都可以指定其他Where
条件并以其他方式修改结果,但它们将始终开始与尚未删除的客户。由于LINQ的延迟执行,此语句不会导致执行任何其他查询。
如果您需要确保没有人可以访问db.Customers
,您可以尝试通过执行此类操作来隐藏它(可能不起作用,我需要查看您的实现):
public new IQueryable<Customer> Customers {
get {
throw new InvalidOperationException("Use property ActiveCustomers instead.");
}
}
答案 1 :(得分:1)
不是将表添加到dbml设计器,而是添加包含缺省where子句的视图,并在dbml中命名视图Customer。
要允许更新,插入和删除,请确保在DBML设计器中选择主键列,并将其Primary Key
属性标记为true。