Условные предложения для запроса linq to Db4O? - PullRequest
0 голосов
/ 27 марта 2009

В linq to sql я могу сделать так:

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

В Db4O linq я не могу сделать это так, потому что я должен начать с

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

В результате

  1. полный перечень ВСЕХ цветов
  2. фильтр по имени.

Это не то решение, к которому я стремился с курса. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 31 августа 2009

Подойдет ли что-нибудь подобное?

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

Вы также можете использовать несколько параметров:

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();
1 голос
/ 27 марта 2009

Я не уверен, к чему ты клонишь. Вы обеспокоены тем, что в первом случае часть кода выполняется на стороне сервера, поэтому вы оптимизируете возвращаемые значения. Но во втором случае перечисление выполняется локально, поэтому нет никакой оптимизации используемых значений?

Если это так, нет способа избежать этого с помощью LINQ to Objects. Объекты находятся в памяти, поэтому нет способа избежать перечисления через них для выполнения операции фильтрации.

0 голосов
/ 27 марта 2009

Что, если вы разделите выражение:

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

Таким образом препроцессор Db4O видит 2 разных запроса LINQ? Даунсайд, конечно, это решение гораздо более многословно и не совсем СУХОЕ

...