Primeiramente vale ressaltar que, o funcionamento de procedures com o Linq to SQL é um tanto diferente e mais complexo do que com tabelas ou views, pois uma procedure pode possuir parametros de entrada, parametros de saída, retornos com tipos de dados diferentes de forma dinâmica, retornos com conjuntos de dados múltiplos, etc. Tudo isto dificulta a interpretação dos resultados.

Para este artigo demonstrarei o uso de uma procedures simples, a mesma apenas retorna todos os registros da tabela de usuários (tbUsuarios):

 

CREATE PROCEDURE SelecionaTodosUsuarios
 
AS
SET NOCOUNT ON
SELECT * FROM tbUsuarios

 

Primeiro vamos arrastar a tabela tbUsuarios para dentro do nosso arquivo SerieLinq.dbml, em seguida arrastamos a procedure e soltamos em cima da tabela de usuários arrastada anteriormente.

Podemos também definir o tipo de retorno da procedure através da propriedade Return type na guia de propriedades da mesma:


Agora vem o interessante, vamos observar o código gerado no arquivo SerieLinq.designer.cs:

 

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.SelecionaTodosUsuarios")]
public ISingleResult<tbUsuario> SelecionaTodosUsuarios()
{
   IExecuteResult result = this.ExecuteMethodCall(this,
                              ((MethodInfo)(MethodInfo.GetCurrentMethod())));
   return ((ISingleResult<tbUsuario>)(result.ReturnValue));
}

Observe que o tipo de retorno de nossa procedure é tbUsuario, isso porque o Linq verificou automaticamente as propriedades de cada objeto (procedure e classe) e mapeou automaricamente o tipo de retorno entre os dois.

NOTA: Caso a procedure e a classe não possuam as mesmas propriedades e tipos, é exibida a seguinte mensagem de erro:

Com isso podemos agora especificar o tipo de retorno ao trabalhar com a procedure ao invés de trabalharmos com o tipo var:

 

IEnumerable<tbUsuario> usuarios = from u in _db.SelecionaTodosUsuarios() select u;
 
foreach (tbUsuario u in usuarios)
Console.WriteLine("Usuário {0}", u.nome);

Rafael Zaccanini
MTAC – Microsoft Technical Audience Contributor

Blog: http://www.rafaelzaccanini.net
Twitter: 
@rafaelzaccanini
Facebook: http://www.facebook.com/RafaelZaccaniniNet