Да, конечно - вы можете выполнить любой произвольный допустимый код .NET в шаблоне T4 - этот шаблон в конце концов преобразуется в класс .NET, который затем компилируется и выполняется.
В чем твоя проблема? Что вы пытались сделать и как далеко вы продвинулись? Где контрольно-пропускные пункты ??
UPDATE:
Я попробовал следующее:
- Я поместил модель 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(",", "_");
}
#>
Здесь я делаю перечисление по Products
в образце базы данных AdventureWorksLT, и я беру все продукты с помощью ProductCategoryID == 5
, используя Linq.
Затем я создаю класс, который содержит строки, в которых имя строковой переменной соответствует (очищенному) имени самого продукта, а строковое значение содержит некоторые биты информации об этом продукте в базе данных.
Как видите, вы можете довольно легко включить модель Linq-to-SQL и запрос LINQ в свой шаблон T4.