我正在使用PredicateBuilder和Colin Meek 的等价物以 WCF 数据服务友好(即没有调用表达式等)的方式编写谓词。这些适用于某些查询,但随着查询复杂性的增加,“递归达到允许的限制”失败。不幸的是,这个限制低于我在代码中正常情况下的预期。我也无法事先确定何时达到此限制。
有可能:
- 在访问 WCF 数据服务之前简化谓词?
- 确定查询复杂性何时超过 WCF 数据服务的限制?
在我的代码中,我正在为接受“州”和“城市”参数的 Azure 数据市场服务构建谓词。我没有为每个城市*州配对发出调用,而是按照以下方式编写谓词:
((city eq City11 or city eq City12 ...or city eq City1N) and (state eq State1))
...
or
((city eq CityM1...) and (state eq StateM))
由于表达式树,实际上谓词会更像这样:
((false or (((false or (City eq City11)) or (City eq City12)) and (State eq State1))) or (((false or (City eq City21)) or (City eq City22)) and (State eq State2)))
使用 LINQPad,我可以捕获请求,手动简化它并证明这些工作一旦简化。因为我的代码没有尝试简化,所以命中 Azure 数据服务的 OData 查询过于复杂/递归并生成异常。在上面的概述中,我应用了诸如 (x 或 y) 或 z == x 或 y 或 z 之类的简化,这具有充分降低查询复杂性以使其通过集合的效果。因此我上面的两个问题。
任何帮助/指针将不胜感激!