gpt4 book ai didi

c# - linq to db4o 中的 Lambda 语法?

转载 作者:行者123 更新时间:2023-11-30 14:43:33 24 4
gpt4 key购买 nike

我知道 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 树来捕捉所有可能的填充属性组合将是疯狂的工作。

可以先调用

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

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

免责声明:几乎重复 my question将近 11 个月前。
随着我现在更好地理解这件事,这个变得更清楚了,我希望现在一些 db4o 开发人员的眼睛能够捕获这一点:

有什么建议吗?

最佳答案

是的,使用 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 的转换。

关于c# - linq to db4o 中的 Lambda 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com