sintaxe lambda em LINQ to db4o?
Pergunta
Eu sei que o seguinte é possível com linq2db4o
from Apple a in db
where a.Color.Equals(Colors.Green)
select a
O que eu preciso, porém, é algo que me permite construir minha consulta condicionalmente (como eu posso em outro linq variantes)
public IEnumerable<Apple> SearchApples (AppleSearchbag bag){
var q = db.Apples;
if(bag.Color != null){
q = q.Where(a=>a.Color.Equals(bag.Color));
}
return q.AsEnumerable();
}
Em uma situação real do searchbag irá realizar muitas propriedades e construir uma árvore se-gigante que captura todas as combinações possíveis de preencher propriedades seria um trabalho louco.
É possível primeira chamada
var q = (from Color c in db select c);
e, em seguida, continuar a partir daí. mas isso não é exatamente o que estou procurando.
Disclaimer: duplicata próxima minha pergunta de cerca de 11 meses atrás.
Este é um pouco mais claro como eu entendo o assunto melhor agora e eu espero que agora alguns dos olhos db4o dev poderia pegar esta sobre isso:
Todas as sugestões?
Solução
Sim, é definitivamente possível para compor consultas LINQ otimizados usando db4o. Admitindo-se que db é definido da seguinte forma:
IObjectContainer db;
Aqui está a sua consulta:
public IEnumerable<Apple> SearchApples (AppleSearchbag bag)
{
var query = db.Cast<Apple> ();
// query will be a Db4objects.Db4o.Linq.IDb4oLinqQuery<Apple>
if (bag.Color != null)
query = query.Where (a => a.Color == bag.Color);
return query;
}
Nesse caso, a consulta será executado sempre que o enumerável retornado está sendo iterado.
Outra possibilidade é usar o mecanismo IQueryable, que tem a vantagem de ser melhor reconhecido por desenvolvedores:
public IQueryable<Apple> SearchApples (AppleSearchbag bag)
{
var query = db.AsQueryable<Apple> ();
// query will be a System.Linq.IQueryble<Apple>
if (bag.Color != null)
query = query.Where (a => a.Color == bag.Color);
return query;
}
Em ambos os casos, db4o vai tentar deduzir uma consulta otimizada a partir da expressão lambda após a execução, e se ele falhar, irá fallback para LINQ para objetos. A primeira tem a vantagem de ser mais directo, evitando o queryable para LINQ para Db4o transformação.