Pregunta

En LINQ to SQL puedo hacer como esto:

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

En DB4O LINQ no puedo hacerlo de esta manera porque tengo que comenzar con

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

Esto resulta en

  1. una enumeración completa de todos los colores
  2. un filtro por su nombre.

Eso no es la solución que yo buscaba fuera de curso. ¿Alguna sugerencia?

¿Fue útil?

Solución

¿Podría algo como esto sea adecuada?

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

A continuación, puede también utilizar varios parámetros:

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();

Otros consejos

No estoy seguro de lo que está recibiendo en. ¿Le preocupa que en el primer caso una parte del código del lado del servidor ejecuta de manera a optimizar los valores devueltos. Pero en el segundo caso la enumeración se hace localmente lo que no hay optimización de los valores utilizados?

Si es así, no hay manera de evitar esto con LINQ a Objetos. Los objetos están en la memoria lo que no hay manera de evitar la enumeración a través de ellos para hacer una operación de filtro.

Lo que si se divide la expresión:

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 esta manera el preprocesador DB4O ve 2 consultas LINQ diferentes? Lo malo es por supuesto esta solución es mucho más prolija y no precisamente SECO ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top