2013-02-08 34 views
0

我們正在動態生成MDX查詢。我們傳遞列的列表([DimesnionName]。[Attribute.Name]格式),行([DimesnionName]。[Attribute.Name]格式)和Filter([DimesnionName]。[Attribute.Name]。[Member Name]格式)以及諸如立方體名稱,頁碼,尺寸等其他輸入。設計庫以生成動態MDX查詢

該信息傳遞給C#庫,然後我們使用大量'If'和'Else'條件來處理此輸入並生成MDX查詢爲一個字符串。它需要很多字符串操作。

你可以說它有一個工作流程。經過每個條件後,系統會生成一些輸出。我想知道是否有更聰明的方式來設計這個庫。

  1. 我想刪除if else條件。
  2. 我想讓它更具可讀性。
  3. 我想使其更易於管理

我的問題是:是否有任何設計原則可以使用嗎?我可以考慮使用Windows WorkFlow。請提供您的建議

回答

0

我實際上在這裏看看是否有人做了這個,所以我不必。到目前爲止沒有運氣。但是,除了我的頭頂,你可能想要看的是某種形式的規則引擎,它將評估目標字符串的狀態並添加各種標準。

現在我甚至還沒有開始研究MDX的語法。我不是那麼遠,但如果我想創建一個引擎來創建SQL查詢,我會看看部分(最簡單的情況下),你需要列的列表,一個表和where子句列表。所以你可以有三個或者只是兩個基本的引擎類,它們需要一個字符串列表(或者更好的是一個表達式列表)並且將它們連接起來(或者對它們進行評估然後連接它們)。如果目標字符串爲空,那麼targetString =「select」+ x else targetString =「,」+ x。然後用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,所以你不得不用這個作爲比喻。

最後的想法不要使用窗口工作流程。你會想在一半的時間內殺死自己,如果你一直這樣做,那麼將來會有開發者詛咒你的名字多年。

好運

哦,如果你建立了請開源的,並告訴我,讓我沒有做到這一點。