3

私は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-tree を構築することは狂人の仕事です。

初コール可能

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

そこから続けます。しかし、これはまさに私が探しているものではありません。

免責事項:ほぼ11か月前の私の質問のほぼ複製。
これは、私が問題をよりよく理解しているので、もう少し明確です。今では、db4o 開発者の一部がこれをキャッチできることを願っています。

助言がありますか?

4

1 に答える 1

6

はい、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;
}

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

もう 1 つの可能性は、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 objects にフォールバックします。最初のものには、クエリ可能から LINQ への db4o への変換を回避することで、より直接的であるという利点があります。

于 2009-12-01T14:23:10.840 に答える