Question

Je sais que ce qui suit est possible avec linq2db4o

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

Cependant, ce dont j'ai besoin, c'est quelque chose qui me permet de construire ma requête de manière conditionnelle (comme dans d'autres 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 situation réelle, le moteur de recherche contiendra de nombreuses propriétés et la construction d'un gigantesque if-tree capturant toutes les combinaisons possibles de propriétés remplies constituerait un travail fou.

Il est possible de commencer par appeler

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

et continuez à partir de là. mais ce n’est pas exactement ce que je recherche.

Avertissement: presque dupliqué de ma question sur près de 11 mois il y a.
Celui-ci est un peu plus clair, car je comprends mieux la question maintenant et j'espère que certains des yeux de db4o dev pourront comprendre ceci:

Des suggestions?

Était-ce utile?

La solution

Oui, il est certainement possible de composer des requêtes LINQ optimisées à l'aide de db4o. Certes, la base de données est définie comme suit:

IObjectContainer db;

Voici votre requête:

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

Dans ce cas, la requête sera exécutée chaque fois que l'énumérable renvoyé est itéré.

Une autre possibilité consiste à utiliser le mécanisme IQueryable, qui présente l’avantage d’être mieux reconnu par les développeurs:

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

Dans les deux cas, db4o essaiera de déduire une requête optimisée de l'expression lambda lors de l'exécution et, si elle échoue, se repliera sur LINQ en objets. Le premier a l’avantage d’être plus direct, en évitant la transformation interrogeable vers LINQ vers db4o.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top