我知道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眼睛可以抓住这个:
有什么建议?
是的,使用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的转换.