Inquiridor
Problema com filtros LINQ to SQL

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 maneiraprivate 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 ficarassim
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;
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
- Sugerido como Resposta Rafael O Nascimento quarta-feira, 20 de março de 2019 16:29
-
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
-
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.
- Editado Schubert Araujo quarta-feira, 20 de março de 2019 17:56
-
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
-
-
-
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
-
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. -
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
-
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);
- Editado Schubert Araujo quarta-feira, 20 de março de 2019 20:37
-
-
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.