如何在T4模板中执行LINQ TO SQL?

时间:2010-04-23 21:21:04

标签: sql templates t4

是否可以在T4模板中执行SQL(TSQL或Linq To SQL),以便表中的架构信息可用于自定义代码生成?

由于

1 个答案:

答案 0 :(得分:1)

是的当然 - 您可以在T4模板中执行任何有效的.NET代码 - 毕竟该模板转换为.NET类,然后进行编译和执行。

你的问题是什么?你有什么尝试,你到底有多远?路障在哪里?

<强>更新
我尝试了以下方法:

  • 我将Linq-to-SQL模型放入名为AdventureWorksData
  • 的类库中
  • 然后我创建了一个新项目(控制台应用程序)
  • 我引用了AdventureWorksData议程

有了这个设置,我可以写一个像这样的T4模板:

<#@ Template Language="C#v3.5" Debug="true" #>
<#@ Output Extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Data.dll" #>
<#@ Assembly Name="System.Data.Linq.dll" #>
<#@ Assembly Name="AdventureWorksData.dll" #>
<#@ Import Namespace="System" #>
<#@ Import Namespace="System.Data" #>
<#@ Import Namespace="System.Data.Linq" #>
<#@ Import Namespace="System.Linq" #>
<#@ Import Namespace="AdventureWorksData" #>
using System;
using AdventureWorksData;

namespace AdventureWorks.Products
{
    public class ProductList
    {
<#
      AdventureWorksDataContext ctx = new AdventureWorksDataContext();

      var result = from p in ctx.Products 
                   where p.ProductCategoryID == 5 
                   select p;

      foreach (Product product in result)
      { 
#>
            public string <#= SanitizeName(product.Name) #> = "<#= product.ProductNumber #> / ID= <#= product.ProductID #>";
<#
      }
#>
    }
}
<#+
       internal string SanitizeName(string input)
       {
           return input.Replace(" ", "_").Replace("-", "_").Replace("/", "_").Replace(".", "_").Replace(",", "_");
       }
#>

我在这里做的是枚举AdventureWorksLT示例数据库中的Products,并使用Linq获取ProductCategoryID == 5的所有产品。

然后我创建了一个包含字符串的类,其中字符串变量的名称对应于产品本身的(已清理的)名称,字符串值包含数据库中该产品的一些信息。

如您所见,您可以相当轻松地将Linq-to-SQL模型和LINQ查询合并到T4模板中。