Parameters 复杂搜索方法的参数化

Parameters 复杂搜索方法的参数化,parameters,Parameters,对于如何处理具有复杂搜索逻辑的DAL方法,是否有最佳实践?我说的是业务需求,比如 “列出其公司处于活动或休眠状态、上一季度订单超过1000美元、不得删除客户、公司必须在伦敦或纽约和巴黎设有办事处的客户…” 这些需求很快使CustomerDAL.GetCustomers(…)拥有9000多个参数,更不用说它一直在变化,如果有很多层、接口、Web服务等,这可能会让人感到痛苦 除了创建CustomerSearchParameters结构(您在调用方法本身之前创建并设置了该结构)之外,还有其他好的方法来

对于如何处理具有复杂搜索逻辑的DAL方法,是否有最佳实践?我说的是业务需求,比如

“列出其公司处于活动或休眠状态、上一季度订单超过1000美元、不得删除客户、公司必须在伦敦或纽约和巴黎设有办事处的客户…”

这些需求很快使CustomerDAL.GetCustomers(…)拥有9000多个参数,更不用说它一直在变化,如果有很多层、接口、Web服务等,这可能会让人感到痛苦


除了创建CustomerSearchParameters结构(您在调用方法本身之前创建并设置了该结构)之外,还有其他好的方法来清理这样的方法吗?

您可以在调用GetCustomers()的方法中构建一个表达式,然后将该表达式传递到查询中,例如

GetCustomer(string where)
然而,这使得验证where子句变得困难。更好的方法可能是使用表达式结构来捕获约束,这也会使在执行查询之前更容易验证表达式:

class Expression {
  string PropertyName
  object value
}

GetCustome(Expression[] constraints)

也许你应该看看这张照片。即使您不使用JPA,这样一个可以动态地向查询添加条件的模型也可以满足您的需要。我建议您确保创建一个透明的API(例如,您的DAL或DAO方法不应该直接依赖JPA标准API)