none
Linq to Sql RRS feed

  • Pergunta

  • Tenho um Procedure onde existem 14 parametros, porem nao preciso de usar todos, preciso saber como limitar na na consulta Linq os parametros ?

    Segue imagem abaixo:

    Obrigado.

    sexta-feira, 15 de junho de 2012 19:11

Todas as Respostas

  • No seu

    "select func.DS_Nome"

    vc ja está limitando a retornar apenas o Nome.

    Quanto aos parametros, se na assinatura da procedure estão os parametros você terá que passar todos eles.


    Quem sabe um dia os DataSets se extinguirão?

    sexta-feira, 15 de junho de 2012 21:39
  • Vixi  , blz entao meu amigo.

    sábado, 16 de junho de 2012 17:52
  • Alguem tem uma segunda opiniao ?
    segunda-feira, 18 de junho de 2012 12:11
  • Manigoldo, não domino muito do assunto mais de uma procura por "optional parameters stored procedure linq to sql", você vai achar alguns links de como usar uma stored procedure onde algum parâmetros são opcionais, se encaixa no seu caso  acima:

    http://www.hookedonlinq.com/CallingStoredProcedureUsingOptionalParameter.ashx

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    segunda-feira, 18 de junho de 2012 12:32
  • Olá Manigoldo,
    Tudo beleza?

    Para vc criar parâmetros opcionais vc precisa, na sua procedure, marcar os parâmetros com "= NULL", desta forma os parâmetros, quando não passados os valores, serão ignorados. Como no exemplo abaixo.

    CREATE PROC spTeste
    	@Name VARCHAR(100) = NULL	
    AS
    BEGIN
    
    	SELECT 
    		* 
    	FROM 
    		TabelaA 
    	WHERE aNome = ISNULL(@Name, aNome)
    	
    END
    GO
    

    Veja que o parâmetro @Name esta com "= NULL" indicando que ele é opcional.

    Mas, mesmo quando vc mapear a procedure para o seu modelo não serão criadas diversas assinaturas para esta chamada a sua procedure. No caso, eu indicaria que vc modificasse o código de seu modelo de dados, adicionando um método que encapsule a chamada a sua procedure com os parâmetros opicionais.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique

    • Sugerido como Resposta EduardoPiresMVP terça-feira, 19 de junho de 2012 12:29
    segunda-feira, 18 de junho de 2012 12:57
    Moderador
  • Infelizmente nao achei uma maneira pesquisei a fundo.

    Se algum souber.

    obrigado a todos.

    terça-feira, 19 de junho de 2012 16:35
  • Galera fiz dessa forma mas nao sei se é correto? tive que excluir os parametros nao nessarios da  "DataClasses.Designer.cs" deixando os que realmente eram necessario.

    Mas essa é a forma correta de se fazer ?

    [global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.SP_CD_FUNCIONARIO")]
    public ISingleResult<SP_CD_FUNCIONARIOResult> SP_CD_FUNCIONARIO(
    [global::System.Data.Linq.Mapping.ParameterAttribute(Name="EXEC", DbType="VarChar(3)")] string eXEC, 
    [global::System.Data.Linq.Mapping.ParameterAttribute(Name="PROCEDIMENTO", DbType="Decimal(18,0)")] System.Nullable<decimal> pROCEDIMENTO, 
    [global::System.Data.Linq.Mapping.ParameterAttribute(Name = "CD_EMPRESA", DbType = "Decimal(18,0)")] System.Nullable<decimal> cD_EMPRESA,
                        [global::System.Data.Linq.Mapping.ParameterAttribute(Name="CD_FUNCIONAL", DbType="Decimal(10,0)")] System.Nullable<decimal> cD_FUNCIONAL)  
    {IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), eXEC, pROCEDIMENTO,cD_EMPRESA,cD_FUNCIONAL);

    return ((ISingleResult<SP_CD_FUNCIONARIOResult>)(result.ReturnValue));
    }

    Obrigado.



    • Editado _Manigold_ terça-feira, 19 de junho de 2012 17:33
    terça-feira, 19 de junho de 2012 17:31
  • Olá Manigoldo,

    Esta forma é possível, mas não é a mais indicada.

    O que eu havia lhe dito anteriormente era para criar outro método, apenas com os parâmetros que vc precisa, e dentro deste método chamar o método que foi mapeador pelo EF para a procedure.

    Desta forma é o mais indicado.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 19 de junho de 2012 17:40
    Moderador
  • ola amigo , infelizmente nao tem como pois a proc tem varios procedimento dentro de uma, vou colar uma aqui, quem sabe vc me ajuda rsrs.


    ALTER PROCEDURE dbo.SP_CD_FUNCIONARIO

    @EXEC VARCHAR(3),
    @PROCEDIMENTO NUMERIC,
    @CD_OPERADOR_LOGIN VARCHAR(10) =NULL,
    @CD_EMPRESA NUMERIC(18) =NULL,
    @CD_FILIAL NUMERIC(18) =NULL,
    @CD_FUNCIONAL NUMERIC(10) =NULL,
    @DS_NOME VARCHAR(60) =NULL,
    @CD_CPF VARCHAR(20) =NULL,
    @CD_RG VARCHAR(20) =NULL,
    @DS_NACIONALIDADE VARCHAR(40) =NULL,
    @DS_ENDERECO VARCHAR(60) =NULL,
    @DS_BAIRRO VARCHAR(40) =NULL,
    @DS_CIDADE VARCHAR(40) =NULL,
    @CD_ESTADO VARCHAR(2)  =NULL,
    @CD_DDD VARCHAR(3)  =NULL,
    @DS_TELEFONE VARCHAR(20) =NULL,
    @CD_TITULO_ELEITOR VARCHAR(20) =NULL,
    @CD_CNH VARCHAR(20) =NULL,
    @CD_STATUS CHAR(1)     =NULL

    AS

    --DECLARA VARIÁVEL DE RETORNO DE ERRO
    DECLARE @MSG VARCHAR(1000)

    --DECLARA VARIÁVEL AUXILIAR
    DECLARE @NR_REGISTROS AS NUMERIC(9)

    --DECLARA VARIAVEIS PARA LOG DE USUÁRIO
    DECLARE @MSG_LOG VARCHAR(500)
    DECLARE @TABELA_LOG VARCHAR(500)
    DECLARE @OPERACAO_LOG VARCHAR(500)

    --PROCEDIMENTOS PARA CONSULTAS
    IF @EXEC = 'SEL'
    BEGIN
    --CONSULTA TODOS OS FUNCIONÁRIOS CADASTRADOS E A QUANTIDADE TOTAL DE REGISTROS
    IF @PROCEDIMENTO = 1
    BEGIN
    SET @NR_REGISTROS = (SELECT COUNT(CD_FUNCIONAL) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_STATUS = 'A')

    SELECT @NR_REGISTROS AS TOTAL_REGISTROS, *, CASE CD_STATUS WHEN 'I' THEN 'Inativo' ELSE 'Ativo' END AS DS_STATUS
    FROM   CD_FUNCIONARIO
    WHERE  CD_EMPRESA = @CD_EMPRESA
    --AND   CD_STATUS  = 'A'
    ORDER BY CD_STATUS ASC ,DS_NOME ASC
    END

    --CONSULTA UM FUNCIONÁRIO ESPECÍFICO POR CÓDIGO FUNCIONAL
    IF @PROCEDIMENTO = 2
    BEGIN
    SELECT * 
    FROM   CD_FUNCIONARIO
    WHERE  CD_FUNCIONAL = @CD_FUNCIONAL
    AND    CD_EMPRESA   = @CD_EMPRESA
    --AND   CD_STATUS = 'A'
    END

    --CONSULTA TODOS OS FUNCIONÁRIOS DE UMA DETERMINADA FILIAL 
    IF @PROCEDIMENTO = 3
    BEGIN
    SELECT * 
    FROM   CD_FUNCIONARIO
    WHERE  CD_EMPRESA = @CD_EMPRESA
    AND   CD_FILIAL  = @CD_FILIAL
    AND   CD_STATUS  = 'A'
    ORDER BY DS_NOME
    END

    --CONSULTA TODOS OS FUNCIONÁRIOS CADASTRADOS E A QUANTIDADE TOTAL DE REGISTROS LIKE PELO CAMPO DS_NOME
    IF @PROCEDIMENTO = 4
    BEGIN
    SET @NR_REGISTROS = (SELECT COUNT(CD_FUNCIONAL) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_STATUS = 'A' AND   DS_NOME LIKE @DS_NOME + '%')

    SELECT @NR_REGISTROS AS TOTAL_REGISTROS, *, CASE CD_STATUS WHEN 'I' THEN 'Inativo' ELSE 'Ativo' END AS DS_STATUS
    FROM   CD_FUNCIONARIO
    WHERE  CD_EMPRESA = @CD_EMPRESA
    --AND   CD_STATUS  = 'A'
    AND   DS_NOME LIKE @DS_NOME + '%'
    ORDER BY CD_STATUS ASC ,DS_NOME ASC
    END
    END

    --PROCEDIMENTOS PARA INCLUSÃO
    IF @EXEC = 'INS'
    BEGIN
    IF @PROCEDIMENTO = 1
    BEGIN
    --VERIFICA SE EXISTE UM FUNCIONÁRIO COM O CPF INFORMADO
    IF EXISTS (SELECT TOP 1 * FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA AND CD_CPF = @CD_CPF)
    BEGIN
    --VALORIZA MENSAGEM DE ERRO
    SET @MSG = 'Já existe um funcionário cadastrado com este CPF !'
    GOTO ERRO
    END

    --Pega o próximo código de categoria
    SET @CD_FUNCIONAL = (SELECT ISNULL(MAX(CD_FUNCIONAL) + 1, 1) FROM CD_FUNCIONARIO WHERE CD_EMPRESA = @CD_EMPRESA)

    --Inclui a categoria
    INSERT INTO CD_FUNCIONARIO
    (CD_EMPRESA, CD_FILIAL, CD_FUNCIONAL, DS_NOME, CD_CPF, CD_RG, DS_NACIONALIDADE, DS_ENDERECO, DS_BAIRRO,
    DS_CIDADE, CD_ESTADO, CD_DDD, DS_TELEFONE, CD_TITULO_ELEITOR, CD_CNH, CD_STATUS)
    VALUES
    (@CD_EMPRESA, @CD_FILIAL, @CD_FUNCIONAL, @DS_NOME, @CD_CPF, @CD_RG, @DS_NACIONALIDADE, @DS_ENDERECO, @DS_BAIRRO,
    @DS_CIDADE, @CD_ESTADO, @CD_DDD, @DS_TELEFONE, @CD_TITULO_ELEITOR, @CD_CNH, @CD_STATUS)

    --VERIFICA A OCORRÊNCIA DE ERROS
    IF @@ERROR > 0 
    BEGIN
    --VALORIZA MENSAGEM DE ERRO
    SET @MSG = 'Ocorreu um erro durante a inclusão do funcionário !'

    GOTO ERRO
    END 

    --Valoriza as variaveis do log
    SET @MSG_LOG = 'INCLUSÃO de funcionário ' + CAST(@CD_FUNCIONAL AS VARCHAR(20))
    SET @TABELA_LOG = 'CD_FUNCIONARIO'
    SET @OPERACAO_LOG = 'I'

    END

    --LIMPA VARIÁVEL DE ERRO
    SET @MSG = ''
    SELECT @MSG AS DS_ERRO
    END

    --PROCEDIMENTOS PARA ALTERAÇÃO 
    IF @EXEC = 'UPD'
    BEGIN
    IF @PROCEDIMENTO = 1
    BEGIN
    --ALTERA FUNCIONÁRIO
    UPDATE CD_FUNCIONARIO
    SET    CD_FILIAL         = @CD_FILIAL,
          DS_NOME           = @DS_NOME,
          CD_CPF            = @CD_CPF,
          CD_RG             = @CD_RG,
          DS_NACIONALIDADE  = @DS_NACIONALIDADE,
          DS_ENDERECO       = @DS_ENDERECO,
          DS_BAIRRO         = @DS_BAIRRO,
          DS_CIDADE         = @DS_CIDADE,
          CD_ESTADO         = @CD_ESTADO,
          CD_DDD            = @CD_DDD,
          DS_TELEFONE       = @DS_TELEFONE,
          CD_TITULO_ELEITOR = @CD_TITULO_ELEITOR,
          CD_CNH            = @CD_CNH,
          CD_STATUS         = @CD_STATUS
    WHERE  CD_FUNCIONAL      = @CD_FUNCIONAL
    AND    CD_EMPRESA        = @CD_EMPRESA

    --VERIFICA A OCORRÊNCIA DE ERROS
    IF @@ERROR > 0 
    BEGIN
    --VALORIZA MENSAGEM DE ERRO
    SET @MSG = 'Ocorreu um erro durante a alteração do funcionário de nome '+CONVERT(VARCHAR(100),@DS_NOME)+' !'

    GOTO ERRO
    END 

    --VALORIZA AS VARIAVEIS DO LOG
    SET @MSG_LOG = 'ALTERAÇÃO de funcionário codigo ' + CAST(@CD_FUNCIONAL AS VARCHAR(20))+', nome '+CONVERT(VARCHAR(100),@DS_NOME)
    SET @TABELA_LOG = 'CD_FUNCIONARIO'
    SET @OPERACAO_LOG = 'A'

    END

    --LIMPA VARIÁVEL DE ERRO
    SET @MSG = ''
    SELECT @MSG AS DS_ERRO
    END

    --ATUALIZACAO DE LOG PARA USUARIO
    IF LEN(@MSG_LOG) > 0 
    BEGIN
    --INCLUI O LOG DE OPERAÇÕES
    INSERT INTO OP_LOG 
    (DT_TRANSACOES, CD_EMPRESA, CD_LOGIN, DS_TABELAS, DS_OPERACOES, DS_DESCRICAO)
    VALUES 
    (GETDATE(), @CD_EMPRESA, @CD_OPERADOR_LOGIN, @TABELA_LOG, @OPERACAO_LOG, @MSG_LOG)

    --ZERA A VARIAVEL DE MENSAGEM DO LOG
    SET @MSG_LOG = ''
    END

    GOTO FIM

    ERRO:
    SELECT @MSG AS DS_ERRO
    RETURN

    FIM:

    OBRIGADO.

    terça-feira, 19 de junho de 2012 17:45
  • Olá,

    Você pode criar um método que reflita sua PROC e depois ir criando outros métodos dependendo de sua necessidade

    public void  executeProcTeste(string param1,param2){
      //CODIGO
    }
    
    public void  executeProcTeste(string param1){
      executeProcTeste(param1,null);
    }



    Não esqueça de marcar o post como útil caso tenha te ajudado.

    terça-feira, 19 de junho de 2012 19:40
  • Olá Manigoldo,

    O que o Marcos disse era o que eu estava comentando a vc. Criei um exemplo para ilustrar o que pode ser feito.

    Criei uma procedure que recebe um parâmetro opcional:

    CREATE PROCEDURE INSERTAVALIACAO
    	@NOTA INT = NULL
    AS
    BEGIN
    	IF (@NOTA IS NULL)
    		INSERT INTO TBAVALIACAO VALUES (5)
    	ELSE 
    		INSERT INTO TBAVALIACAO VALUES (@NOTA)
    END
    GO


    Depois mapei-a com o Entity Framework... se vc olhar o arquivo Designer.Cs do seu arquivo EDMX verá que existe um método com o nome de sua procedure, como o código abaixo, que foi gerado com a procedure que mapeei:

    public int INSERTAVALIACAO(Nullable<global::System.Int32> nOTA)
    {
        ObjectParameter nOTAParameter;
        if (nOTA.HasValue)
        {
            nOTAParameter = new ObjectParameter("NOTA", nOTA);
        }
        else
        {
            nOTAParameter = new ObjectParameter("NOTA", typeof(global::System.Int32));
        }
        
        return base.ExecuteFunction("INSERTAVALIACAO", nOTAParameter);
    }


    Agora, crie um método com o mesmo nome do método criado pelo Entity Framework, só que utilizando apenas os parâmetro que vc realmente quer utilizar.

    No caso, para este exemplo, criei um método sem parâmetros. E, no corpo do método vc deve chamar o método criado pelo Entity Framework, passando NULL nos parâmetro que vc não deseja mais utilizar, desta forma:

    public int INSERTAVALIACAO()
    {
        return INSERTAVALIACAO(null);
    }

    Desta forma, vc acaba criando duas assinaturas diferentes para a mesma chamada de procedure, só que o seu código C# terá a possibilidade de chamar uma assinatura de método apenas com os parâmetros que vc realmente precisa.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    • Sugerido como Resposta Vitor Mendes quarta-feira, 20 de junho de 2012 12:35
    quarta-feira, 20 de junho de 2012 03:26
    Moderador