0

我们正在动态生成 MDX 查询。我们传递列列表([DimesnionName].[Attribute.Name] 格式)、行([DimesnionName].[Attribute.Name] 格式)和过滤器([DimesnionName].[Attribute.Name].[Member Name] 格式)以及其他输入,如多维数据集名称、页码、度量等。

此信息被传递到 C# 库,然后我们使用大量“If”和“Else”条件来处理此输入并将 MDX 查询生成为字符串。它需要大量的字符串操作。

你可以说它有一个工作流程。在经历每个条件后,系统会生成一些输出。我想知道是否有更聪明的方法来设计这个库。

  1. 我想删除 if else 条件。
  2. 我想让它更具可读性。
  3. 我想让它更易于管理

我的问题是:我可以使用任何设计原则吗?我可以考虑使用 Windows WorkFlow。请提供您的建议

4

1 回答 1

0

我实际上是在这里看看是否有人这样做,所以我不必这样做。到目前为止没有运气。但是在我的脑海中,您可能想要查看的是某种形式的规则引擎,它将评估目标字符串的状态并添加您的各种标准。

现在我什至还没有开始研究 MDX 的语法。我并没有那么远,但是如果我想创建一个引擎来创建 sql 查询,我会查看部分(首先是最简单的情况),您需要列列表、表和 where 子句列表。因此,您可以拥有三个或可能只有两个基本引擎类,其中一个接受字符串列表和(或更好的是表达式列表)并将它们连接起来(或评估然后连接它们)。如果目标字符串为空,则 targetString = "select "+ x else targetString = ", " + x。然后用 where 表达式做类似的事情。对于实现不同形式的 where 表达式等的构建类,您可以获得更多的幻想。然后最终你会通过你的引擎像

MySqlEngine(new[] {"FirstName", "LastName", "GirlFriendsAddress"},
           new []{EqualsExpression("FirstName","Brown"), EqualsExpression("LastName",Dynamite")},
           "People");

它会返回

"SELECT FirstName, LastName, GirlFriendsAddress From People Where FirstName = \"Brown\" AND LastName = \"Dynamite\""

我强烈建议使用表达式来评估与您的表匹配的目标模型上的属性。然后,您可以使 MySqlEnigine(...) 不必提供给表名,因为您的模型可以命名相同,并且除了 where 子句的目标值之外,您不使用任何字符串。

我知道这不是您想要的引擎,但我还不知道 MDX,因此您必须将其用作类比。

最后的想法不要使用窗口工作流。你会想半途而废,如果你一直坚持下去,那么未来很多年都会有开发者诅咒你的名字。

祝你好运

哦,如果您构建了请开源它并告诉我,这样我就不必这样做了。

于 2013-08-30T13:45:46.570 回答