Вопрос

Я знаю, что с 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 с запросом.

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