cláusulas condicionais para consulta LINQ to db4o?
Pergunta
Em LINQ to SQL eu posso fazer como este:
var q = db.Colors;
if(! string.IsNullOrEmpty(colorName))
q = q.Where(c=>c.Name.Equals(colorName));
return q.ToList();
Em DB4O linq Eu não posso fazê-lo assim porque eu tenho que começar com
var q = (from Color c in db
select c);
if(! string.IsNullOrEmpty(colorName))
q = q.Where(c=>c.Name.Equals(colorName));
return q.ToList();
Isso resulta em
- a enumeração completa de todas as cores
- um filtro pelo nome.
Isso não é a solução que eu estava apontando para fora do curso. Alguma sugestão?
Solução
Será que algo como isto ser adequado?
return (from Color c in db
where !String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName)
select c).ToList();
Você pode então também usar vários parâmetros:
return (from Color c in db
where (!String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName))
|| (!String.IsNullOrEmpty(color1Name) && c.Name.Equals(color1Name))
|| (!String.IsNullOrEmpty(color2Name) && c.Name.Equals(color2Name))
...
select c).ToList();
Outras dicas
Eu não sei o que você quer chegar. Você está preocupado que, no primeiro caso algum de lado do servidor executa o código de modo a otimizar os valores devolvidos. Mas no segundo caso, a enumeração é feita localmente por isso não há otimização sobre os valores usados?
Se assim for, não há nenhuma maneira de evitar isso com o LINQ to Objects. Os objetos estão na memória por isso não há maneira de evitar enumerando através deles para fazer uma operação de filtro.
E se você dividir a expressão:
IDb4oLinqQuery<Color> q;
if(! string.IsNullOrEmpty(colorName))
{
q = from Color c in db
where c.Name.Equals(colorName)
select c;
}
else
{
q = from Color c in db
select c;
}
return q.ToList();
Desta forma, o pré-processador DB4O vê 2 LINQ consultas diferentes? Desvantagem é fora do curso esta solução é muito mais detalhado e não exatamente DRY ..