FILTRAR COM LINQ OS CAMPOS NULL

MRSILVA 23/02/2017 17:07:21
#471914
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.

  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.
OCELOT 23/02/2017 17:55:16
#471915
Resposta escolhida
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

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
MRSILVA 24/02/2017 15:38:34
#471928
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!
Tópico encerrado , respostas não são mais permitidas