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

StackOverflow https://stackoverflow.com/questions/689732

  •  22-08-2019
  •  | 
  •  

Вопрос

В 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. фильтр по имени.

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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 видит два разных запроса LINQ?Обратной стороной является то, что это решение, конечно, гораздо более многословное и не совсем СУХОЕ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top