Условные предложения для запроса 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();
Это приводит к
- полный перечень ВСЕХ цветов
- фильтр по имени.
Конечно, это не то решение, к которому я стремился.Какие-либо предложения?
Решение
Подойдет ли что-то подобное?
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?Обратной стороной является то, что это решение, конечно, гораздо более многословное и не совсем СУХОЕ.