FILTRAR COM LINQ OS CAMPOS NULL
Olá.
Estou utilizando linq para filtrar vários campos de uma só vez conforme código abaixo, só que alguns campos não é de preenchimento obrigatório e são null e por esse motivo acontece um erro [Ô]Referência de objeto não definida para uma instância de um objeto.[Ô]. Quanto todos os campos estão preenchido o erro não acontece, alguém sabe se é possÃvel corrigir isso? Estava pensando em preencher os campos vazios com o caractere [Ô]-[Ô] antes de gravar no banco de dados, mas queria evitar isso.
Desde já agradeço.
Estou utilizando linq para filtrar vários campos de uma só vez conforme código abaixo, só que alguns campos não é de preenchimento obrigatório e são null e por esse motivo acontece um erro [Ô]Referência de objeto não definida para uma instância de um objeto.[Ô]. Quanto todos os campos estão preenchido o erro não acontece, alguém sabe se é possÃvel corrigir isso? Estava pensando em preencher os campos vazios com o caractere [Ô]-[Ô] antes de gravar no banco de dados, mas queria evitar isso.
dados.DataSource = ListaDeProdutos.Where(c => c.Id.Contains(txtSubFiltro.Text) ||
c.CodigoProdCli.Contains(txtSubFiltro.Text) ||
c.CodBarras.Contains(txtSubFiltro.Text) ||
c.Descricao.Contains(txtSubFiltro.Text)).ToList();
Desde já agradeço.
Dependendo do que for essa sua ListaDeProdutos e da versão do C# usada eu posso imaginar duas soluções, vamos considerar que a descrição pode ser nula
Como o operador && é um operador E de curto circuito ele não vai executar a segunda comparação caso o resultado seja falso, isso deve funcionar para qualquer caso
A outra solução é usar o operador ?. que só está disponÃvel a partir do C# 6, ou seja, você precisa estar usando o VS.Net 2015 se não me engano, porém a versão do framework não faz diferença
Este operador já faz a verificação de nulo, só que como neste caso ele retorna um Nullable<bool> é necessário fazer a comparação com true ou o vai dar um erro de compilação
dados.DataSource = ListaDeProdutos.Where(c => c.Id.Contains(txtSubFiltro.Text) ||
c.CodigoProdCli.Contains(txtSubFiltro.Text) ||
c.CodBarras.Contains(txtSubFiltro.Text) ||
(c.Descricao != null && c.Descricao.Contains(txtSubFiltro.Text))).ToList();
Como o operador && é um operador E de curto circuito ele não vai executar a segunda comparação caso o resultado seja falso, isso deve funcionar para qualquer caso
A outra solução é usar o operador ?. que só está disponÃvel a partir do C# 6, ou seja, você precisa estar usando o VS.Net 2015 se não me engano, porém a versão do framework não faz diferença
dados.DataSource = ListaDeProdutos.Where(c => c.Id.Contains(txtSubFiltro.Text) ||
c.CodigoProdCli.Contains(txtSubFiltro.Text) ||
c.CodBarras.Contains(txtSubFiltro.Text) ||
c?.Descricao.Contains(txtSubFiltro.Text) == true).ToList();
Este operador já faz a verificação de nulo, só que como neste caso ele retorna um Nullable<bool> é necessário fazer a comparação com true ou o vai dar um erro de compilação
Muito obrigado Ocelot.
Não sabia que era possÃvel (nunca tinha tentado) usar [Ô]?[Ô] para indicar que atributo pode receber null achava que somente podia usar nas propriedades de uma classe e no tipo inteiro, através dessa sua ajuda melhorei outros códigos do meu projeto.
Realmente na versão 2013 não aceita a segunda opção.
No problema do meu post utilizei a primeira opção, mas utilizei a segunda em outros locais do meu projeto.
Utilizo a versão 2015.
Muito obrigado!
Não sabia que era possÃvel (nunca tinha tentado) usar [Ô]?[Ô] para indicar que atributo pode receber null achava que somente podia usar nas propriedades de uma classe e no tipo inteiro, através dessa sua ajuda melhorei outros códigos do meu projeto.
Realmente na versão 2013 não aceita a segunda opção.
No problema do meu post utilizei a primeira opção, mas utilizei a segunda em outros locais do meu projeto.
Utilizo a versão 2015.
Muito obrigado!
Tópico encerrado , respostas não são mais permitidas