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?

Foi útil?

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.

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