2009-12-01 5 views
3

Je sais que ce qui suit est possible avec linq2db4oSyntaxe Lambda dans linq à db4o?

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

Ce que je dois est cependant quelque chose qui me permet de construire ma requête conditionnelle (comme je peux 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(); 
} 

Dans un vrai Situation mondiale Le sac de recherche contiendra de nombreuses propriétés et la construction d'un arbre géant qui capture toutes les combinaisons possibles de propriétés remplies serait un travail de fou.

Il est possible d'appeler d'abord

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

puis continuer à partir de là. mais ce n'est pas exactement ce que je cherche.

Avis de non-responsabilité: près du double de my question de près de 11 mois.
Celui-ci est un peu plus clair que je comprends mieux la question maintenant et j'espère maintenant certains des yeux de db4o dev pourraient attraper ceci sur ceci:

Des suggestions?

Répondre

6

Oui, il est certainement possible de composer des requêtes LINQ optimisées en utilisant db4o. En admettant que db est défini 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 est le retour étant itérées dénombrable plus.

Une autre possibilité est d'utiliser le mécanisme IQueryable, qui a 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 va essayer d'en déduire une requête optimisée de l'expression lambda lors de l'exécution, et si cela échoue, se repliera sur LINQ aux objets. Le premier a l'avantage d'être plus direct, en évitant la requête de LINQ vers la transformation db4o.

+0

Brillant. Exactement ce que je cherchais: D –

+0

Bien que j'ai essayé l'option AsQueryable, mais la méthode ne semble pas exister sur le IObjectContainer. Cette méthode réside-t-elle ailleurs que dans Db4objects.Db4o.Linq? –

+0

Utilisez-vous la dernière version de db4o? C'est définitivement là. Bien qu'il soit défini sur ISodaQueryFactory, mais IObjectContainer étend cette interface. Vous venez d'ajouter une directive using pour Db4objects.Db4o.Linq. –

Questions connexes