2010-04-23 10 views

Répondre

1

Oui bien sûr - vous pouvez exécuter un code arbitraire .NET valide dans un modèle T4 - ce modèle est converti en une classe .NET, après tout, qui est ensuite compilé et exécuté.

Quel est votre problème? Qu'avez-vous essayé de faire et jusqu'où êtes-vous venu? Où sont les barrages routiers ??

MISE À JOUR:
J'ai essayé les éléments suivants:

  • je mets un modèle LINQ to SQL dans une bibliothèque de classe appelée AdventureWorksData
  • J'ai ensuite créé un nouveau projet (application console)
  • Je AdventureWorksData que l'assemblage référencé

Avec ce s ise en place, je peux écrire un modèle T4 quelque chose comme ceci:

<#@ 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(",", "_"); 
     } 
#> 

Ce que je fais ici est énumérer sur la Products dans la base de données exemple AdventureWorksLT, et je prends tous les produits avec ProductCategoryID == 5, en utilisant Linq. Je crée ensuite une classe qui contient des chaînes où le nom de la variable chaîne correspond au nom (stérilisé) du produit lui-même, et la valeur chaîne contient certains des bits d'information sur ce produit dans la base de données.

Comme vous pouvez le voir, vous pouvez assez facilement incorporer un modèle Linq-to-SQL et une requête LINQ dans votre modèle T4.

+0

Merci pour la réponse. Par exemple, j'essaie de faire quelque chose comme ce qui suit. Je veux savoir comment la connexion db doit être configurée (par exemple, en utilisant NorthWind db) dans le template T4. var résultat = de p dans db.Produits où p.CategoryID == 5 sélectionnez p; \t \t \t \t \t \t \t foreach (point var en résultat) { WriteComment (item.ProductName); – NewT4

+1

Merci pour l'exemple de code. – NewT4