69

I am using T4 to generate some screens and middle-tier code for a project, and would like to use Linq to simplify some of my template code. However, when I try to use Linq, the template reports a syntax error.

1 Answer 1

102

By default in Visual Studio 2008 (and as used in most online examples) the template is compiled with the 2.0 Framework, which does not include Linq. (See MSDN forum thread)

To solve the problem, three steps are needed:

  1. In your template's language attribute, specify "C#v3.5" or "VBv3.5" - this step is not required for VS2010, where .Net 4.0 is always used.
  2. Add an assembly directive for System.Core.dll
  3. Import the System.Linq namespace

Your template will now look something like this:

<#@ template language="C#v3.5" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

You can now use Linq and other new language features in your template.

4
  • I had to use <#@ assembly name="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" #> to get the 3.5 version of System.Core.dll. Commented Apr 2, 2009 at 22:16
  • By chance, was the "containing" project a 2.0/3.0 project? That may explain why it didn't know how to find System.Core without the fully-qualified name. Commented Apr 9, 2009 at 17:26
  • This worked for me after I changed the language from C# to C#v3.5. Thanks! Weird how the intellisense didn't show this as an option! Commented Feb 19, 2010 at 16:35
  • Never did understand why when I press F12 on a LINQ .Select method call and it takes me to System.Linq.Enumerable the assembly name shown at the top is System.Linq but you need the System.Core assembly for to work. Commented Apr 22 at 2:47

Not the answer you're looking for? Browse other questions tagged or ask your own question.