La syntaxe Lambda dans linq to db4o?
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?
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.