将默认的where子句添加到linq-to-sql表中

时间:2012-09-21 19:06:20

标签: c# linq linq-to-sql

是否可以为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代码中看到它。这种默认设置很方便,所以我不必记得为每个查询添加过滤器。

2 个答案:

答案 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。