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

  1. a enumeração completa de todas as cores
  2. um filtro pelo nome.

Isso não é a solução que eu estava apontando para fora do curso. Alguma sugestão?

Foi útil?

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 ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top