2009-03-27 9 views
0

Dans LINQ to SQL que je peux faire comme ceci:Clauses conditionnelles pour une requête linq vers Db4O?

var q = db.Colors; 
if(! string.IsNullOrEmpty(colorName)) 
    q = q.Where(c=>c.Name.Equals(colorName)); 
return q.ToList(); 

db4o LINQ Je ne peux pas le faire comme ça parce que je dois commencer par

var q = (from Color c in db 
     select c); 
if(! string.IsNullOrEmpty(colorName)) 
    q = q.Where(c=>c.Name.Equals(colorName)); 
return q.ToList(); 

Il en résulte

  1. une énumération complète de toutes les couleurs
  2. un filtre par son nom.

Ce n'est pas la solution que je visais bien sûr. Des suggestions?

Répondre

2

Est-ce que quelque chose comme ce serait approprié?

return (from Color c in db 
     where !String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName) 
     select c).ToList(); 

Vous pouvez également utiliser plusieurs paramètres:

return (from Color c in db 
     where (!String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName)) 
      || (!String.IsNullOrEmpty(color1Name) && c.Name.Equals(color1Name)) 
      || (!String.IsNullOrEmpty(color2Name) && c.Name.Equals(color2Name)) 
      ... 
     select c).ToList(); 
+0

Wow, ceci est un vieux post. Je pense que maintenant linq to DB4O supporte les expressions lambda. Pas sûr, n'ont pas eu la chance de travailler avec elle récemment. Si non votre solution pourrait probablement fonctionner. Le soir prochain j'ai un peu de temps je vais le vérifier :) –

+0

J'ai finalement réussi à le faire, et il semble que le linq 2 db4o n'est toujours pas capable d'obtenir ce que je veux. La syntaxe que vous suggérez est possible, mais j'aimerais quand même avoir une syntaxe plus propre (lambda). –

1

Je ne suis pas sûr de ce que vous obtenez. Etes-vous inquiet que dans le premier cas une partie du code s'exécute côté serveur de sorte que vous optimisez les valeurs retournées. Mais dans le second cas, l'énumération est faite localement donc il n'y a pas d'optimisation sur les valeurs utilisées?

Si tel est le cas, il n'y a aucun moyen d'éviter cela avec LINQ to Objects. Les objets sont en mémoire donc il n'y a aucun moyen d'éviter de les énumérer pour faire une opération de filtrage.

+0

C'est en effet la question: Comment puis-je éviter que la clause where dans le second exemple devient un linq2objects? Je préférerais que ça fasse partie du linq2Db4o donc le moteur db4o peut l'optimiser. –

0

si vous divisez l'expression:

IDb4oLinqQuery<Color> q; 
if(! string.IsNullOrEmpty(colorName)) 
{ 
    q = from Color c in db 
     where c.Name.Equals(colorName) 
     select c; 
} 
else 
{ 
    q = from Color c in db 
     select c; 
} 
return q.ToList(); 

De cette façon, le préprocesseur db4o voit 2 différentes requêtes LINQ? Inconvénient est bien sûr cette solution est beaucoup plus verbeuse et pas exactement DRY ..

+0

En outre, dans mon application du monde réel, il serait d'environ 10 paramètres qui sont tous facultatifs, donc cela ferait un sacré si. –

Questions connexes