参数化复杂的搜索方法

时间:2010-02-18 08:19:53

标签: parameters

是否有关于如何使用复杂搜索逻辑处理DAL方法的最佳实践?我在谈论像

这样的业务需求

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

这些要求很快使您的CustomerDAL.GetCustomers(...)拥有超过9000个参数,更不用说它会一直变化,如果您有大量的图层,接口,Web服务等,这可能会很痛苦。

除了创建在调用方法本身之前创建和设置的CustomerSearchParameters结构之外,还有其他方法可以清理这样的方法吗?

2 个答案:

答案 0 :(得分:1)

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

GetCustomer(string where)

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

class Expression {
  string PropertyName
  object value
}

GetCustome(Expression[] constraints)

答案 1 :(得分:1)

也许你应该看一下JPA Criteria API。即使您没有使用JPA这样的模型,您可以动态地向您的查询添加Criteria,也可以满足您的需求。我建议您确保创建透明API(您的DAL或DAO方法,例如不应直接依赖JPA Criteria API)。