Pregunta

Sé que lo siguiente es posible con linq2db4o

from Apple a in db
where a.Color.Equals(Colors.Green)
select a

Sin embargo, lo que necesito es algo que me permite construir mi consulta condicionalmente (como puedo en otras variantes de linq)

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();
}

En una situación del mundo real, la bolsa de búsqueda tendrá muchas propiedades y la construcción de un árbol de si gigante que atrapa todas las combinaciones posibles de propiedades completadas sería un trabajo de locos.

Es posible llamar primero

var q = (from Color c in db select c);

y luego continuar desde allí. pero esto no es exactamente lo que estoy buscando.

Descargo de responsabilidad: casi el duplicado de mi pregunta de casi 11 meses hace.
Esto es un poco más claro ya que entiendo el asunto mejor ahora y espero que ahora algunos de los ojos de desarrollo de db4o puedan captar esto en esto:

¿Alguna sugerencia?

¿Fue útil?

Solución

Sí, definitivamente es posible componer consultas LINQ optimizadas usando db4o. De acuerdo con que db se define de la siguiente manera:

IObjectContainer db;

Aquí está su 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;
}

En ese caso, la consulta se ejecutará siempre que el enumerable devuelto se repita.

Otra posibilidad es utilizar el mecanismo IQueryable, que tiene la ventaja de ser mejor reconocido por los desarrolladores:

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;
}

En ambos casos, db4o intentará deducir una consulta optimizada de la expresión lambda tras la ejecución, y si falla, recurrirá a LINQ para los objetos. El primero tiene la ventaja de ser más directo, al evitar la transformación consultable a LINQ to db4o.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top