Как выполнить LINQ TO SQL в шаблоне T4? - PullRequest
3 голосов
/ 24 апреля 2010

Можно ли выполнить SQL (TSQL или Linq To SQL) из шаблона T4, чтобы информацию схемы из таблицы можно было использовать для настройки генерации кода?

Спасибо

1 Ответ

1 голос
/ 24 апреля 2010

Да, конечно - вы можете выполнить любой произвольный допустимый код .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.

...