linq到db4o的Lambda语法?

Bor*_*ens 3 .net c# linq db4o

我知道linq2db4o可以实现以下功能

from Apple a in db
where a.Color.Equals(Colors.Green)
select a
Run Code Online (Sandbox Code Playgroud)

然而,我需要的是允许我有条件地构建我的查询(就像我可以在其他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();
}
Run Code Online (Sandbox Code Playgroud)

在现实世界的情况下,搜索包将拥有许多属性并构建一个巨大的if-tree,捕获所有可能的填充属性组合将是疯子的工作.

可以先打电话

var q = (from Color c in db select c);
Run Code Online (Sandbox Code Playgroud)

然后从那里继续 但这并不是我想要的.

免责声明:近11个月前我的问题几乎重复.
这个更清楚,因为我现在更好地理解了这个问题,我希望现在有些db4o dev眼睛可以抓住这个:

有什么建议?

Jb *_*ain 6

是的,使用db4o组成优化的LINQ查询绝对是可能的.假设db定义如下:

IObjectContainer db;
Run Code Online (Sandbox Code Playgroud)

这是您的查询:

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;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,只要迭代返回的枚举,就会执行查询.

另一种可能性是使用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;
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,db4o将尝试在执行时从lambda表达式推导出优化查询,如果失败,将回退到LINQ对象.第一个具有更直接的优点,通过避免查询到LINQ到db4o的转换.