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

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

Ce n'est pas la solution que je visais hors cours. Toutes les suggestions?

Était-ce utile?

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 ..

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