2011-09-20 52 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