Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Posicionamento da função DefaultIfEmpty

Ganhador = Lances .Where(l => l.Valor > _valorDestino) .DefaultIfEmpty(new Lance(null, 0)) .OrderBy(l => l.Valor) .FirstOrDefault();

Fiz um teste aqui se esse método ficar em cima do where e não retornar nenhum lance após a condição where gera uma exceção, fiz essa alteração e funcionou. É isso mesmo?

5 respostas

Olá.

Pode postar aqui exatamente como estava antes pra ficar mais fácil o entendimento?

Valeu.

// Estava antes do where
Ganhador = Lances.DefaultIfEmpty(new Lance(null, 0))
.Where(l => l.Valor > _valorDestino).OrderBy(l => l.Valor) .FirstOrDefault();
solução!

A exceção estourava nessa linha ou quando tentava utilizar a variável Ganhador? Nessa linha acho que não deveria dar erro, mas quando fosse utilizar a variável sim, pois você passa um objeto Lance default com Valor 0 e sua condição do WHERE não deve ser satisfeita, retornando uma lista vazia. Em seguida, você ainda utiliza o método .FirstOrDefault() que retorna o primeiro elemento da lista. Como é uma lista vazia, seu objeto ficará nulo e, ao tentar acessar alguma de suas propriedades, vai causar exceção.

Na sua alteração, você coloca um WHERE antes que continua retornando uma lista vazia, porém utilizando depois o DefaultIfEmpty, sua lista será populada com o default desse método (porque a lista está vazia) e o .FirstOrDefault() vai retornar esse objeto pra variável Ganhador, onde ela não será mais nula.

Enfim, do jeito que dava erro dava pra fazer um tratamento de nulo antes de usar a variável, ou tirar o FirstOrDefault e validar se a lista está populada antes de pegar algum elemento. Há algumas formas, mas a sua alteração é melhor que já resolve esse problema.

Obrigado pelo esclarecimento Bruno, só queria validar essa alteração mesmo para que ficasse registrado para os novos alunos essa correção

Ah sim, beleza!

Abs.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software