4

是否可以为 Linq-to-SQL 类生成的每个 SQL 语句添加默认 where 子句?

我有一个带有 Customer 类的自定义 DataContext。NULLCustomer 类有一个 Deleted 属性,这是我在查询表时希望始终保持的属性。

例如,我可以写:

List<Customer> customers = db.Customers.ToList<Customer>();

但真正得到:

List<Customer> customers = db.Customers.Where(o => o.Deleted == null).ToList<Customer>();

我想在我的数据库中维护“已删除”的数据,但永远不需要在我的 .NET 代码中看到它。这种默认设置会很方便,因此我不必记住将过滤器添加到每个查询中。

4

2 回答 2

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.");
    }
}
于 2012-09-21T19:11:18.803 回答
1

不要将表添加到您的 dbml 设计器中,而是添加一个包含默认 where 子句的视图,然后在您的 dbml 中将视图命名为 Customer。

要允许更新、插入和删除,请确保在 DBML 设计器中选择主键列,并将它们的Primary Key属性标记为 true。

于 2012-09-21T20:15:02.800 回答