我们有一个非常复杂的查询,我们允许用户使用许多预定义的过滤器。 该查询涉及大约20个表,您可能会想象结果中的行计数(在分页之前)是查询中最慢的部分。
目前我正在考虑通过基于用户提供的过滤器连接表来使COUNT查询动态化,从而使COUNT查询更轻量级。
E.g:
没有给出过滤器:
SELECT
COUNT(BaseTable.Id)
FROM BaseTable
过滤其他表:
SELECT
COUNT(BaseTable.Id)
FROM BaseTable
JOIN OtherTable ON BaseTable.OtherTableId = OtherTable.Id
WHERE OtherTable.SomeColumn = 'criterion'
虽然从概念上来说很容易掌握并且可能需要几个小时的工作,但它可能会变得有点麻烦和混乱,特别是考虑到所涉及的表数量。
我想我不是唯一一个面对这个(或类似的)问题的人,所以我想知道其他人是如何接近同样的情况的。是不是有更优雅的解决方案?
答案 0 :(得分:0)
阅读你的问题
您要求建立计数和选择陈述的方法
这是建立这两个陈述的方法
我用它,既不麻烦也不凌乱
通过查询构建器并将行放在base,count或select中是多么困难?
您需要将查询分解为/ join和where / sort
select语句将是独立的。
StringBuilder sbBaseFromJoin = new StringBuilder();
StringBuilder sbBaseWhere = new StringBuilder();
StringBuilder sbCountSelect = new StringBuilder();
StringBuilder sbCountFromJoin = new StringBuilder();
StringBuilder sbCountWhere = new StringBuilder();
StringBuilder sbDTOSelect = new StringBuilder();
StringBuilder sbDTOFromJoin = new StringBuilder();
StringBuilder sbDTOWhereSort = new StringBuilder();
浏览当前的查询构建器并打破行
count = sbCountSelect + sbBaseFromJoin + sbCountFromJoin + sbBaseWhere + sbCountWhere
DTO = sbDTOSelect + sbBaseFromJoin + sbDTOFromJoin + sbBaseWhere + sbDTOWhereSort
P.S。如果您的联接没有参与where或select并且严重影响性能,那么您需要查看查询。