none
Problema com filtros LINQ to SQL RRS feed

  • Pergunta

  • Boa tarde, tenho uma tela de listagem e estou tendo problemas no momento de filtrar minhas informações

    o código está da seguinte maneira

    private void BtnPesquisar_Click(object sender, EventArgs e)
            {
                
                buscar(CPF.Text, RazaoSocial.Text, CNPJ.Text);
            }
    
    
    
    public void buscar(string cpf, string nome, string cnpj)
            {
                this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.RazaoSocialNome.Contains(nome) && x.Cpf == cpf && x.cnpj == cpnj);
              
            }

    O primeiro problema é, ali ele só esta buscando um campo que no caso é o cpf, o outros ele só valida se o cpf estiver inserido. Já fiz de tudo pra resolver mas não funciona. Ele resolve buscar só um parâmetro. Eu preciso que senda operador "AND" mesmo.

    O outro problema é como que posso fazer um filtro dinâmico disso ai. Por exemplo se quiser buscar só cpf ficar

    assim 

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.Cpf == cpf);
    ou se inserir informaçao nome e cpf mudar o parametro ali pra (
    (x => x.Cpf == cpf && x.RazaoSocialNome.Conteins(nome))

    e pro ai vai, tem como eu criar um metodo pra retornar so os parametros que eu quero de acordo com os textboxs preenchidos?

    Desde já agradeço;

    segunda-feira, 18 de março de 2019 17:18

Todas as Respostas

  • Olhando o seu exemplo, creio que deve-se fazer apenas uma simples mudança. Creio que você tem tanto pessoas físicas, que possuem apenas CPF, quanto pessoas Jurídicas que possuem apenas  CNPJ. Você esta fazendo um 

     x.Cpf == cpf && x.cnpj == cpnj

    Ou seja esta obrigando que o registro tenha os dois, creio que o correto seria:

    public void buscar(string cpf, string nome, string cnpj)
            {
                this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.RazaoSocialNome.Contains(nome) && (x.Cpf == cpf || x.cnpj == cpnj));
              
            }

    Que dessa maneira precisar ter CPF ou CNPJ.

    Espero ter ajudado

    terça-feira, 19 de março de 2019 14:10
  • Olá, completando a resposta do Rafael, para pesquisar os parâmetros de acordo com os textboxs preenchidos.

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => (x.RazaoSocialNome.Contains(nome) || nome == null) && ((x.Cpf == cpf || cpf == null) || (x.cnpj == cpnj || cnpj == null));

    Se ajudou, vote como útil! Obrigado.

    • Sugerido como Resposta LeonardoBastos terça-feira, 19 de março de 2019 23:42
    terça-feira, 19 de março de 2019 22:55
  • Bom, eu havia feito o teste sem o CNPJ apenas com CPF e com Nome. A sugestão dos filtros vou tentar ainda..
    Mas por algum motivo desconhecido ou bizarro se eu pesquiso o nome sozinho ele não funciona o filtro. O CPF sozinho ele já funciona. Só quando o CPF é inserido que o filtro do nome funciona. É bizarro.

    Como sou iniciante sem c# deve ter alguma coisa que eu não fiz ou estou colocando de forma errada.

    Obs: Já alterei o código pelo que o Leonardo Sugeriu. 

    Olha que estranho. Aqui a tela iniciando




    Digito "C" e aperto, aqui ele ja devia achar. Mas não funciona.

    aqui só o cpf já funciona:


    E aqui com cpf preenchido ele funciona de forma correta:



    Alguém ta enxergando algo que eu não estou? Ta foda, to perdendo tempo demais com isso.


    quarta-feira, 20 de março de 2019 17:54
  • Olá, é que está com AND, ajustei para OR, tenta com esse código.

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => (x.RazaoSocialNome.Contains(nome) || nome == null) || (x.Cpf == cpf || cpf == null) || (x.cnpj == cpnj || cnpj == null));

    ou para simplificar

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.RazaoSocialNome.Contains(nome) || x.Cpf == cpf || x.cnpj == cpnj);


    Se ajudou, vote como útil! Obrigado.




    • Sugerido como Resposta LeonardoBastos quarta-feira, 20 de março de 2019 18:21
    • Editado LeonardoBastos quarta-feira, 20 de março de 2019 18:25
    quarta-feira, 20 de março de 2019 18:20
  • Com o OR ele busca faz o contrário, funciona o filtro de nome e de CPF não funciona, só quando o nome esta preenchido.

    Que bizarrice. Eu não faço ideia do que possa ser.
    Pode ser que o conteins esteja influenciando.
    quarta-feira, 20 de março de 2019 19:13
  • Fiz o teste e o problema acontece quando tem o "Contains". A opção que você deus de quando os filtros vazios não funciona.
    quarta-feira, 20 de março de 2019 19:17
  • Olá, tenta o código...

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.RazaoSocialNome.Contains(nome) || nome.Equals("") || x.Cpf == cpf || x.cnpj == cpnj);
    

    Se ajudou, vote como útil! Obrigado.

    • Sugerido como Resposta LeonardoBastos quarta-feira, 20 de março de 2019 19:51
    quarta-feira, 20 de março de 2019 19:34
  • Também não funcionou. O problema da com o contains.
    A questão dos textsboxs vazios eu resolvi.
    Porem o filtro com contains ainda não funciona de maneira nenhuma. Creio que ele passa info vazia ("") e o contains deve levar em conta que a string tem essa informação "". Tentando buscar uma solação para isso aqui.

    quarta-feira, 20 de março de 2019 20:02
  • Olá, tenta o código...

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => nome.Contains(x.RazaoSocialNome) || x.Cpf == cpf || x.cnpj == cpnj);

    Se ajudou, vote como útil! Obrigado.

    • Sugerido como Resposta LeonardoBastos quarta-feira, 20 de março de 2019 20:13
    quarta-feira, 20 de março de 2019 20:13
  • Deu erro, 
    Infelizmente tive que resolver com gambiarra ao meu ve. Caso alguem tenha solução melhor me informe

    if (nome != "")
                    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.RazaoSocialNome.Contains(nome) || x.Cpf == cpf || x.Cnpj == cnpj);
    else
                    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.Cpf == cpf || x.Cnpj == cnpj);


    quarta-feira, 20 de março de 2019 20:37
  • Boa tarde

    Dessa maneira talvez não funciona?

    this.tbClientesBindingSource.DataSource = DataContextFactory.DataContext.TbClientes.Where(x => x.Cpf == cpf || x.Cnpj == cnpj ||  x.RazaoSocialNome.IndexOf(nome) > 0);

    quarta-feira, 20 de março de 2019 20:55
  • Olá, tenta com código...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.OracleClient;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Cliente
        {
            public string RazaoSocial { get; set; }
            public string CPF { get; set; }
            public string CNPJ { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                List<Cliente> listaClientes = new List<Cliente>() {
                    new Cliente() { RazaoSocial = "Cliente 1", CPF = "11111111111", CNPJ = null },
                    new Cliente() { RazaoSocial = "Cliente 2", CPF = "22222222222", CNPJ = null },
                    new Cliente() { RazaoSocial = "Cliente 3", CPF = "33333333333", CNPJ = null }
                };
    
                var nome = "C";
                var cpf = "";
                var cnpj = "";
    
                var r = listaClientes.Where(x => x.RazaoSocial.Contains(nome) || x.CPF == cpf || x.CNPJ == cnpj);
    
                foreach (var item in r)
                {
                    Console.WriteLine(string.Format("RazaoSocial: {0}, CPF: {1}, CNPJ: {2}", item.RazaoSocial, item.CPF, item.CNPJ));
                }
                Console.ReadLine();
            }
        }
    }

    Se ajudou, vote como útil! Obrigado.

    quarta-feira, 20 de março de 2019 20:59