Лямбда-синтаксис в linq to db4o?
Вопрос
Я знаю, что с linq2db4o возможно следующее
from Apple a in db
where a.Color.Equals(Colors.Green)
select a
Однако мне нужно что-то, что позволяет мне строить свой запрос условно (как я могу в других вариантах linq)
public IEnumerable<Apple> SearchApples (AppleSearchbag bag){
var q = db.Apples;
if(bag.Color != null){
q = q.Where(a=>a.Color.Equals(bag.Color));
}
return q.AsEnumerable();
}
В реальной ситуации поисковая сумка будет содержать много свойств, и создание гигантского if-дерева, которое улавливает все возможные комбинации заполненных свойств, будет работой сумасшедшего.
Можно сначала позвонить
var q = (from Color c in db select c);
, а затем продолжить оттуда. но это не совсем то, что я ищу.
Отказ от ответственности: почти дубликат моего моего вопроса почти 11 месяцев назад.
Это немного яснее, так как теперь я понимаю этот вопрос лучше, и я надеюсь, что к этому моменту некоторые из разработчиков db4o смогут это понять:
Есть предложения?
Решение
Да, определенно возможно составлять оптимизированные запросы LINQ, используя db4o. Разумеется, что db определяется следующим образом:
IObjectContainer db;
Вот ваш запрос:
public IEnumerable<Apple> SearchApples (AppleSearchbag bag)
{
var query = db.Cast<Apple> ();
// query will be a Db4objects.Db4o.Linq.IDb4oLinqQuery<Apple>
if (bag.Color != null)
query = query.Where (a => a.Color == bag.Color);
return query;
}
В этом случае запрос будет выполняться всякий раз, когда возвращаемое перечисляемое значение повторяется.
Еще одна возможность - использовать механизм IQueryable, преимущество которого в том, что он лучше распознается разработчиками:
public IQueryable<Apple> SearchApples (AppleSearchbag bag)
{
var query = db.AsQueryable<Apple> ();
// query will be a System.Linq.IQueryble<Apple>
if (bag.Color != null)
query = query.Where (a => a.Color == bag.Color);
return query;
}
В обоих случаях db4o при выполнении попытается вывести оптимизированный запрос из лямбда-выражения, а в случае неудачи откатится к LINQ к объектам. Первое имеет преимущество в том, что оно более прямолинейно, поскольку позволяет избегать преобразования в LINQ в db4o с запросом.