我知道下面是可能linq2db4o

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

我需要什么但是什么,允许我建立我的查询有条件地(喜欢我可以在皇宫的其他变体)

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

在一个真正的世界形势的searchbag将举行许多特性,并建立一个巨大的果树,捕获的所有可能的组合充性质将是疯子的工作。

它可以第一个电话

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

然后从那里继续。但是这不正是我要找的。

免责声明:近重复的 我的问题 近11个月前。
这个是一个比较清楚,因为我了解该问题现在好多了我希望通过现在的一些创建db4o开发的眼睛能抓住这在这样的:

任何建议?

有帮助吗?

解决方案

是的肯定是能够撰写优化皇宫查询使用的创建db4o.授予该数据库定义如下:

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将尝试推断优化查询lambda表达在执行,以及如果失败,将退回到皇宫的对象。第一个拥有的优势是更加直接的,通过避免可查询到皇宫,以创建db4o的转变。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top