LINQ para iniciantes 8 - Executando procedures em LINQ

watch_later 2 de jul de 2013

Como podemos executar Stored Procedures usando o LINQ?

Passo 1: Criando uma Stored Procedure
Abaixo está a Stored Procedure que será usado criar objetos LINQ:

CREATE PROCEDURE dbo.usp_SelectCustomer
AS
SELECT CustomerId,CustomerCode,CustomerName from Customer
RETURN

Passo 2: Criar entidade LINQ
A Stored Procedure a cima armazenada retorna CustomerId, CustomerCode e CustomerName, por isso precisamos preparar uma entidade LINQ conforme os dados de retorno do Stored Procedure.Se você não estiver ciente do que se trata uma Entidade LINQ recomendo que leia o artigo:
LINQ para iniciantes - PARTE 1

[Table(Name = "Customer")]
public class clsCustomerEntity
{
    private int _CustomerId;
    private string _CustomerCode;
    private string _CustomerName;

    [Column(DbType = "nvarchar(50)")]
    public string CustomerCode
    {
        set
        {
            _CustomerCode = value;
        }
        get
        {
            return _CustomerCode;
        }
    }

    [Column(DbType = "nvarchar(50)")]
    public string CustomerName
    {
        set
        {
            _CustomerName = value;
        }
        get
        {
            return _CustomerName;
        }
    }

    [Column(DbType = "int", IsPrimaryKey = true)]
    public int CustomerId
    {
        set
        {
            _CustomerId = value;
        }
        get
        {
            return _CustomerId;
        }
    }
}

Passo 3: Herdar da classe DataContext
Para executar Stored Procedures, LINQ tem uma função de chamada ExecuteMethod que pertence à classe DataContext. Esta função retorna um ISingleResult de uma coleção entidade. A função de chamada ExecuteMethod é uma função protected e só pode ser invocada por meio de herança. Métodos e funções do que chamamos de nossos Stored Procedures normalmente forma a nossa DAL. Em outras palavras, ExecuteMethod deve ser uma parte do nosso DAL.
Como eu disse, a função é puramente protected. Você só pode invocá-la por herança e não por agregação. Realmente não sei por que essa compulsão é posta pela Microsoft. Em outras palavras, precisamos criar uma classe extra que herde de DataContext e, em seguida, colocar as correspondentes chamadas de função para os Stored Procedures. Abaixo está o trecho de código onde herdei da classe DataContext e criei uma nova classe DAL chamado ClsMyContext.

public class clsMyContext : DataContext 
{
}

Passo 4: Atributo usando o atributo Função
Nós criamos a função GetCustomerAll que é atribuído com o atributo da função do namespace System.Data.Linq.Mapping. O atributo de função tem um parâmetro de nome que especifica o nome da Procedure, atualmente, a Procedure é usp_SelectCustomer conforme definido nas etapas anteriores.
O parâmetro IsComposable define se esta chamada de método é para uma Procedure ou uma UDF (User Defined Function). Se IsComposable é falso, isso significa que é um procedimento armazenado e, se for verdade, isso significa que é uma função definida pelo usuário.

[Function(Name = "usp_SelectCustomer", IsComposable = false)]

public ISingleResult<clsCustomerEntity> getCustomerAll()
{
}

Passo 5: Invocando a chamada ExecuteMethod
Agora é hora de preencher o GetCustomerAll função vazia. Abaixo está a forma de executar a chamada ExecuteMethod. Esta chamada retorna um objeto IExecuteResult.

IExecuteResult objResult = this.ExecuteMethodCall(this,(MethodInfo)(MethodInfo.GetCurrentMethod()));

O objeto retornado de IExecuteResult tem uma propriedade ReturnValue a partir do qual podemos obter a coleção de resultados do tipo ClsCustomerEntity.

ISingleResult<clsCustomerEntity> objresults = (ISingleResult<clsCustomerEntity>) objResult.ReturnValue;

Abaixo está o trecho de código completo com o metódo:

[Function(Name = "usp_SelectCustomer", IsComposable = false)]
public ISingleResult<clsCustomerEntity> getCustomerAll()
{
    IExecuteResult objResult = 
      this.ExecuteMethodCall(this,(MethodInfo)(MethodInfo.GetCurrentMethod()));

    ISingleResult<clsCustomerEntity> objresults = 
      (ISingleResult<clsCustomerEntity>) objResult.ReturnValue;
    return objresults;
}

Passo 6: Finalmente, chamamos o DataContext do cliente
Na etapa final, e só criar o objeto de contexto, chamamos o nosso metódo, e percorremos os dados de exibição dos objetos.

clsMyContext objContext = new clsMyContext(strConnectionString);
foreach(var row in objContext.getCustomerAll())
{
    Response.Write(row.CustomerCode);
}

Bom galera , ficamos por aqui a abaixo estão os links das postagens da mesma série , espero que seja útil ,qualquer dúvida comente , ou mande email para contato@virtualbase.com.br

Lista de Postagens da série LINQ PARA INICIANTES :