Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Deise Vicky

[Resolvido] Consulta com n filtros usando Linq to Entity

Recommended Posts

Oi galera!

Seguinte,eu trabalho com .net/c# e Linq to Entity.

Me surgiu a seguinte situação:

Preciso realizar consultas no banco com 10 filtros, mas detalhe, o usuário pode selecionar 1 só filtro como pode selecionar todos, então, eu pensei,tenho que verificar quais filtros estão preenchidos pra realizar a consulta no banco...mas nessa situação eu teria que verificar todas as possibilidades de seleção dos campos de filtro para efetuar a consulta, ou seja, meu método iria ficar cheio de if e else....ficaria inviável!

Existe alguma maneira de verificar dentro da consulta se o parâmetro(filtro) está vazio?

 

Alguém sabe algum modo que eu possa fazer esse filtro de maneira mais simplificada?

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi galera!

Seguinte,eu trabalho com .net/c# e Linq to Entity.

Me surgiu a seguinte situação:

Preciso realizar consultas no banco com 10 filtros, mas detalhe, o usuário pode selecionar 1 só filtro como pode selecionar todos, então, eu pensei,tenho que verificar quais filtros estão preenchidos pra realizar a consulta no banco...mas nessa situação eu teria que verificar todas as possibilidades de seleção dos campos de filtro para efetuar a consulta, ou seja, meu método iria ficar cheio de if e else....ficaria inviável!

Existe alguma maneira de verificar dentro da consulta se o parâmetro(filtro) está vazio?

 

Alguém sabe algum modo que eu possa fazer esse filtro de maneira mais simplificada?

 

Obrigada!

 

Deise, veja isso lhe ajuda:

 

se você estiver usando SQL SERVER, você pode fazer isso na Query, exemplo:

 

SELECT
    Id
    ,Nome
    ,Cor
    ,Modelo
FROM
   DBO.Veiculo(NOLOCK)	
WHERE 
	
   AND (Nome = @Nome OR @Nome = null)
   AND (Cor = @Cor OR @Cor = null)
   AND (Modelo = @Modelo OR @Modelo = null)

Caso o usuário selecione o filtro, você envia o valor, senão você manda NULL!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deise, veja isso lhe ajuda:

 

se você estiver usando SQL SERVER, você pode fazer isso na Query, exemplo:

 

SELECT
    Id
    ,Nome
    ,Cor
    ,Modelo
FROM
   DBO.Veiculo(NOLOCK)	
WHERE 
	
   AND (Nome = @Nome OR @Nome = null)
   AND (Cor = @Cor OR @Cor = null)
   AND (Modelo = @Modelo OR @Modelo = null)

Caso o usuário selecione o filtro, você envia o valor, senão você manda NULL!

Cara, valeu por ter respondido!

 

Parece muito simples dessa forma, mas o problema, como eu havia falado, é implementar esse select junto com linq to entity...eu uso o SQL Server sim,mas nunca utilizei por exemplo Stored Procedure com linq...

 

Tentei fazer da seguinte maneira:

var res = from al in context.MovimentacaoPessoal
          join fu in context.Funcionario on al.FuncionarioCodigo equals fu.FuncionarioCodigo
          where al.NomeUnidadeLotacao.Equals(
              !String.IsNullOrEmpty(unidade) ? unidade : String.Empty)
          && al.CentroCustoNome.Equals(
              !String.IsNullOrEmpty(nomeCentroCusto) ? nomeCentroCusto : String.Empty) 
          select new
          {
              fu.FuncionarioNome,
              al.FuncionarioCodigo,
              al.CentroCustoNome,
              al.UnidadeLotacaoNome,
              al.MovimentacaoCodigo,
              inStatus = al.MovimentacaoStatus
          };

Como está,usando "&&" no where, ele traz a consulta somente se os dois parâmetros tiver algum valor, se eu colocar "||", ele traz todos os registros que tem aquele centro de custo e todos que tem aquela unidade,e eu preciso trazer os que tem o centro de custo e a unidade iguais aos parâmetros...

 

Como eu faria se eu utilizasse StoredProcedure com linq?

Alguém tem um exemplo?

Eu procurei uns exemplos na internet,mas nenhum atende minhas necessidades...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nunca trabalhei com linq, mas podemos dar uma pesquisada sobre o assunto!

Você realmente precisa usar linq para fazer essa consulta?

 

Pq se você usar esse esquema que te falei, você vai fazer o filtro na Procedure e depois vai fazer outro filtro com o linq, acho que vai ficar estranho. Você não poderia retornar no resultado da Procedure direto sem usar o linq?

 

Outra coisa que pensei é deixar do jeito que você fez com linq mesmo, e no seu WHERE

 

where al.NomeUnidadeLotacao.Equals(              
      !String.IsNullOrEmpty(unidade) ? unidade : String.Empty)          
&& al.CentroCustoNome.Equals(            
      !String.IsNullOrEmpty(nomeCentroCusto) ? nomeCentroCusto : String.Empty)

e tentar pesquisar algo do tipo http://forum.imasters.com.br/public/style_emoticons/default/seta.gif

 

 where (al.NomeUnidadeLotacao.Equals(
                !String.IsNullOrEmpty(unidade) ? unidade : String.Empty)|| al.NomeUnidadeLotacao == Null)
        && (al.CentroCustoNome.Equals(            
                !String.IsNullOrEmpty(nomeCentroCusto) ? nomeCentroCusto : String.Empty) || al.CentroCustoNome = Null)

Da uma olhada depois:

http://pt.w3support.net/index.php?db=so&id=586097

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver o problema!

Aí vai o código pra quem tiver a mesma dúvida:

 

var res = from mo in context.MovimentacaoPessoal
          join fu in context.Funcionario on mo.FuncionarioCodigo equals fu.FuncionarioCodigo
          where (mo.CentroCustoCodigo.CentroCustoNome.Contains(
                  "Paramentro") || mo.CentroCustoCodigo.CentrodeCusto.Equals(""))
          && (mo.UnidadeLotacaoCodigo.UnidadeLotacao.Contains(
                  "Paramentro") || mo.UnidadeLotacaoCodigo.UnidadeLotacao.Equals(""))
          select new
          {
              ...
          };

Bem parecido com o que o David propôs, só não precisei usar operadores ternários!

 

Valeu pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver o problema!

Aí vai o código pra quem tiver a mesma dúvida:

 

var res = from mo in context.MovimentacaoPessoal
          join fu in context.Funcionario on mo.FuncionarioCodigo equals fu.FuncionarioCodigo
          where (mo.CentroCustoCodigo.CentroCustoNome.Contains(
                  "Paramentro") || mo.CentroCustoCodigo.CentrodeCusto.Equals(""))
          && (mo.UnidadeLotacaoCodigo.UnidadeLotacao.Contains(
                  "Paramentro") || mo.UnidadeLotacaoCodigo.UnidadeLotacao.Equals(""))
          select new
          {
              ...
          };

Bem parecido com o que o David propôs, só não precisei usar operadores ternários!

 

Valeu pela ajuda!

 

 

Parabéns Deise, é isso ae

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.