clauses conditionnelles pour LINQ to requête db4o?
Question
Dans LINQ to i SQL peut faire comme ceci:
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
- une énumération complète de toutes les couleurs
- un filtre par nom.
Ce n'est pas la solution que je visais hors cours. Toutes les suggestions?
La solution
Would quelque chose comme ça convenir?
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();
Autres conseils
Je ne sais pas ce que vous voulez en venir. Craignez-vous que dans le premier cas une partie du code côté serveur exécute si vous optimisez les valeurs retournées. Mais dans le second cas, l'énumération est faite localement il n'y a pas d'optimisation sur les valeurs utilisées?
Dans ce cas, il n'y a aucun moyen d'éviter cela avec LINQ aux objets. Les objets sont en mémoire donc il n'y a aucun moyen d'éviter à travers eux à énumérer faire une opération de filtrage.
Et 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? Le seul inconvénient est bien sûr cette solution est beaucoup plus bavard et pas exactement DRY ..