Os tipos genéricos foram adicionados ao framework 2.0 e estão dentro do namespace System.Collections.Generic.
Uma consulta LINQ é baseada em generic types (tipos genéricos). Para utilizar não é necessário ter um conhecimento profundo sobre tipos genéricos (generic types). No entanto, é importante compreender dois conceitos básicos:
1. Quando você cria uma instância de uma classe de coleção genérica, como List<T>, você substitui o “T” com o tipo de objeto que a lista irá trabalhar. Por exemplo, uma lista de strings é expresso como List<string>, e uma lista de objetos Usuario é expresso como List< Usuario >:
//Lista genérica de string
List<string> listaDeString = new List<string>();
//Lista genérica de objetos do tipo Usuario
List<Usuario> listaDeUsuario = new List<Usuario>();
Uma lista (List) genérica é fortemente tipado e oferece muitas vantagens sobre coleções que armazenam seus elementos como Object. Se você tentar adicionar um Usuario a um List<string>, você obterá um erro (argumento inválido) em tempo de compilação, pois o objeto esperado é do tipo string:

2. É a interface IEnumerable<T> que permite que classes de coleções genérica possam ser enumerados usando a instrução foreach.
IEnumerable<T> como variável em consultas LINQ
Variáveis de consulta LINQ são escritas como IEnumerable<T> ou um tipo derivado, como IQueryable<T>. Quando você vê uma variável de consulta que é escrita como IEnumerable<Usuario>, isso significa apenas que a consulta, quando ela é executada, irá produzir uma seqüência de zero ou mais objetos do tipo Usuario:
IEnumerable<Usuario> usuariosAtivosQuery = from u in usuarios
where u.ATIVO == true
select u;
foreach (Usuario user in usuariosAtivosQuery)
{
Console.WriteLine("Nome: {0}", user.NOME);
}
Permitindo que o compilador resolva o tipo em tempo de execução
Você pode evitar escrever o tipo genérico usando a palavra-chave var. A palavra-chave var instrui o compilador para inferir o tipo de uma variável de consulta ao olhar para a fonte de dados especificado na cláusula from. O exemplo a seguir produz o mesmo código compilado como o exemplo anterior:
var usuariosAtivosQuery = from u in usuarios
where u.ATIVO == true
select u;
foreach (Usuario user in usuariosAtivosQuery)
{
Console.WriteLine("Nome: {0}", user.NOME);
}
A palavra-chave var é útil quando o tipo da variável é óbvio ou quando ele não é tão importante para especificar explicitamente tipos genéricos, tais como aqueles que são produzidos por consultas.
O objeto utilizado no exemplo foi:
class Usuario
{
public int CODIGO { get; set; }
public string NOME { get; set; }
public bool ATIVO { get; set; }
}
Referência:
LINQ and Generic Types (C#)
http://msdn.microsoft.com/en-us/library/bb546142.aspx