Условные предложения для запроса linq to Db4O?

В 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. фильтр по названию.

Это не то решение, к которому я стремился, конечно. Какие-либо предложения?


person Boris Callens    schedule 27.03.2009    source источник


Ответы (3)


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

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();
person thesuperav    schedule 31.08.2009
comment
Вау, это старый пост. Я думаю, что к настоящему времени linq to DB4O поддерживает лямбда-выражения. Не уверен, в последнее время не было возможности с ним работать. Если бы не ваше решение, возможно, сработало бы. Вечером будет свободное время, проверю :) - person Boris Callens; 31.08.2009
comment
Я наконец добрался до него, и кажется, что linq 2 db4o все еще не способен получить то, что я хочу. Предлагаемый вами синтаксис возможен, но мне все же хотелось бы иметь более чистый (лямбда) синтаксис. - person Boris Callens; 01.12.2009

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

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

person JaredPar    schedule 27.03.2009
comment
Это действительно вопрос: как я могу избежать того, что предложение where во втором примере становится linq2objects? Я бы предпочел, чтобы он был частью linq2Db4o, чтобы движок db4o мог его оптимизировать. - person Boris Callens; 27.03.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? Недостатком является то, что это решение гораздо более подробное и не совсем СУХОЕ.

person Davy Landman    schedule 27.03.2009
comment
Кроме того, в моем реальном приложении было бы около 10 параметров, и все они были бы необязательными, так что это сделало бы одно адское if. - person Boris Callens; 27.03.2009