Frage

Ich weiß, ist folgendes möglich mit linq2db4o

from Apple a in db
where a.Color.Equals(Colors.Green)
select a

Was ich brauche, aber etwas, das ich meine Abfrage bedingt erstellen kann (wie ich kann in anderen Linq Varianten)

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

In einer realen Situation wird die searchbag viele Eigenschaften halten und einen riesigen Bau if-Baum, der alle möglichen Kombinationen von ausgefüllt Eigenschaften fängt würde Arbeit Wahnsinnigen sein.

Es ist möglich, erster Anruf

var q = (from Color c in db select c);

und dann von dort aus weiter. aber das ist nicht genau das, was ich suche.

Hinweis: in der Nähe von Duplikat meine Frage von fast 11 Monaten vor.
Dies ist ein bisschen mehr klar, wie ich die Sache jetzt besser verstehen, und ich hoffe, jetzt einige der db4o dev Augen dies auf diese fangen konnten:

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ja, es ist auf jeden Fall möglich, optimierte LINQ-Abfragen zu komponieren db4o verwenden. Zugegeben, dass db ist wie folgt definiert:

IObjectContainer db;

Hier ist Ihre Abfrage:

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;
}

In diesem Fall wird die Abfrage ausgeführt, wenn der zurück enumerable iteriert wird.

Eine andere Möglichkeit ist es, die IQueryable Mechanismus zu verwenden, die den Vorteil hat besser von den Entwicklern erkannt zu werden:

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;
}

In beiden Fällen wird db4o versuchen, eine optimierte Abfrage aus dem Lambda-Ausdruck bei der Ausführung abzuleiten, und wenn es fehlschlägt, wird auf LINQ zu Objekten Rückfall. Der erste Teil hat den Vorteil direkter sein, durch die abfragbaren zu LINQ vermeiden Transformation db4o.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top