【问题标题】:Using t4 templates to generate in-memory SQL at runtime使用 t4 模板在运行时生成内存中的 SQL
【发布时间】:2011-11-20 23:46:53
【问题描述】:

我们正在构建一个查询服务,该服务需要解析用户的搜索词并从中生成一种形式的 SQL(不是 T-SQL,而是一种专有的类似 SQL 的查询语言)。 为了生成 SQL,我们正在研究 T4 模板。

我在Creating T4 templates at runtime (build-time) 上查看了另一个问题,我理解了基本思想;然而,我们需要的是不是物理文件输出,而是包含最终 SQL 语句的简单内存字符串。 这可能吗?

我的第二个问题几乎更重要:考虑到我们需要在 T4 模板文件中生成 SQL 的相当复杂的逻辑,这个 T4 的东西有多快。 谢谢。

【问题讨论】:

    标签: c# .net tsql t4


    【解决方案1】:

    我认为你想看看预处理模板(又名运行时模板)。您可以使用模板预处理文本模板在 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());
        }
    }
    

    就性能而言,老实说,我没有足够的运行时模板经验来为您提供建议。我建议阅读生成的代码并对其进行分析。

    【讨论】:

    • 谢谢!这样可行!它还向我展示了 T4 模板并不真正适合我们想要实现的目标。如果我们不需要文件,您认为生成 SQL 是否可行?在我看来,无论如何我们都必须将生成 SQL 的逻辑放在一个单独的类中,而 T4 只是处理起来很麻烦。只需使用 StringBuilder 或其他东西。
    • 我喜欢 T4,但我不确定它是否是从表达式生成高度动态 SQL 的正确工具。如果您认为它看起来很麻烦并且字符串生成器更可取,那么请使用 StringBuilder。不需要仅仅为了它而使用T4。但是在某些情况下,运行时模板可能非常有用。例如,如果您想将静态内容与动态内容混合使用。
    • 同意 FuleSnabel 的观点,即动态和静态的混合是最佳选择。如果您的 sql-ish 语言中的几乎每个元素都是可变的,具体取决于输入搜索词,那么实际上您只是将单个 ADT 从一种具体语法转换为另一种。另一方面,如果输出 sql 中有重要的样板,并且它实际上只是由查询条件参数化,那么 T4 是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2013-02-26
    • 2011-04-07
    • 2011-10-28
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多