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

在现实世界的情况下,searchbag 将包含许多属性,构建一个巨大的 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;
}

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

另一种可能是使用 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 表达式推导出优化查询,如果失败,将回退到 LINQ to objects。第一个具有更直接的优势,避免了可查询到 LINQ 到 db4o 的转换。

于 2009-12-01T14:23:10.840 回答