質問

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開発者の目がこれでこれをキャッチできることを望んでいます:

提案はありますか

役に立ちましたか?

解決

はい、db4oを使用して最適化されたLINQクエリを作成することは間違いなく可能です。 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;
}

その場合、返されたenumerableが繰り返されるたびにクエリが実行されます。

別の可能性として、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 toオブジェクトにフォールバックします。最初の方法には、LINQからdb4oへのクエリ可能な変換を回避することにより、より直接的であるという利点があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top