2011-09-20 53 views
3

我們正在構建一個查詢服務,它需要解析用戶的搜索詞並生成一種形式的SQL(不是T-SQL,但是是一種專有的類SQL查詢語言)它。 要生成SQL,我們正在研究T4模板。使用t4模板在運行時生成內存中的SQL

我看了一下Creating T4 templates at runtime (build-time)處的另一個問題,我理解了基本思想;然而我們需要的是不是物理文件輸出,而是包含最終SQL語句的簡單內存字符串。 這可能嗎?

我有第二個問題,這更重要:考慮到我們需要在T​​4模板文件中生成SQL的相當複雜的邏輯時,這個T4的速度有多快。 謝謝。

回答

2

我想你想看看預處理模板(又名運行時模板)。您可以使用模板預處理文本模板在Visual Studio 2010中創建它們。

我創造了這個非常簡單的模板(我把它命名爲MyTemplate.tt):

<#@ template language="C#"#> 
<# 
    for (var iter = 0; iter < HowManyCommentsToGenerate; ++iter) 
    { 
#> 
    // <#=iter#> 
<# 
    } 
#> 

我補充說,擴展了HowManyCommentsToGenerate場生成的類此部分類:

partial class MyTemplate 
{ 
    int HowManyCommentsToGenerate; 

    public MyTemplate (int count) 
    { 
     HowManyCommentsToGenerate = count; 
    } 
} 

最後我用像這樣(注意輸出字符串不是一個文件):

class Program 
{ 
    static void Main(string[] args) 
    { 
     var str = new MyTemplate(32); 
     Console.Write(str.TransformText()); 
    } 
} 

至於性能,我真的沒有足夠的運行時模板經驗來爲您提供建議。我建議閱讀生成的代碼並對其進行分析。

+0

謝謝!這樣可行!它也向我展示了T4模板並不適合我們試圖實現的目標。如果我們不需要文件,你認爲生成SQL是否可行?對我來說,似乎我們必須將SQL生成邏輯放在一個單獨的類中,而T4只是麻煩的處理。只需使用一個StringBuilder或其他東西。 – John

+0

我喜歡T4,但我不確定它是否是從表達式生成高度動態SQL的正確工具。如果你認爲看起來很麻煩,並且字符串生成器是最好的,那麼去StringBuilder。沒有必要爲了它而使用T4。但是在某些情況下,運行時模板可能非常有用。例如,如果你喜歡混合靜態內容和動態內容。 – FuleSnabel

+0

同意FuleSnabel,動態和靜態的組合是甜蜜點。如果你的sql-ish語言中幾乎每個元素都是可變的,這取決於輸入的搜索詞,那麼你真的只是將一個ADT從一個具體語法翻譯成另一個。另一方面,如果在輸出sql中有重要的樣板文件,並且它只是通過查詢條件進行參數化,那麼T4是一個不錯的選擇。 – GarethJ