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

Dúvida LINQ

Considerando a chamáda: produtoDao.BuscaPorNomePrecoCategoria("Mouse", 0 , "Informática")

Como é possível combinar os filtros no where dessa forma, pois nesse caso sobrescrevemos a variável "busca" que já haviam entrado primeiro if, por exemplo.

O código funciona, mas não entendi o porquê.

class ProdutoDAO {
    private EntidadesContext ctx;
    public ProdutoDAO(EntidadesContext ctx) {
        this.ctx = ctx;
    }

    public IList<Produto> BuscaPorPrecoNomeCategoria(string nome,decimal preco,string categoria) {
        var busca = from p in this.ctx.Produtos select p;        

        if(!String.IsNullOrEmpty(nome)) {
            busca = busca.Where(p=> p.Nome == nome);
        }
        if(preco > 0) {
            busca = busca.Where(p => p.Preco == preco);
        }
        if(!String.IsNullOrEmpty(categoria)) {
            busca = busca.Where(p => p.Categoria.Nome == categoria);
        }
        return busca.ToList();
    }
}
3 respostas
solução!

Olá Tiago.

Vamos considerar que você passou como parâmetro o nome bola, preço 10.00 e categoria esportes. Assim que o código entra no primeiro if, a variável que contém todos os produtos será filtrada para os que têm nome bola. Podem ser várias bolas, ou seja, isso ainda pode ser uma lista. Seguindo o código, caso o valor da variável preco seja maior que 0, quer dizer que você quer filtrar por preço, então a variável busca que já contém todas as bolas, será filtrada para a(s) bola(s) que tem valor igual ao preço recebido como parâmetro. Por fim, isso ainda pode ser uma lista e, caso seja passada uma categoria como parâmetro, essa lista pode ser filtrada para bolas com valor específico e que sejam de determinada categoria (por exemplo, bola de futebol de R$ 10.00 é da categoria esportes e bola de exercícios de R$ 10.00 é da categoria fitness).

Geralmente os filtros são mais inteligentes, mas é basicamente isso.

[]'s.

Valeu Bruno

Até ai ok, porém como a lista só é executada quando chamamos o método ToList(), pensei que só iria executar o filtro do último if.

Então cara, o seu método pede retorno IList<Produto>, que é o que o busca.ToList() no final do método faz, ele transforma a variável busca que é um IEnumerable<Produto> por conta do retorno do método Where() do Linq. Entretanto, o busca.ToList() está no final do método e será executado de qualquer forma, indepente dos seus ifs. Caso o código não entre em nenhum if, o busca.ToList() retornará uma lista vazia, onde na chamada desse método você precisa de uma condição pra verificar se a lista é vazia e retornar alguma mensagem, ou fazer o que quiser quando entrar nessa condição :)