gpt4 book ai didi

c# - 将 ravendb 查询作为 Func 传递不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:05:55 25 4
gpt4 key购买 nike

我正在玩 RavenDb,想知道我是否遗漏了一些明显的东西。

事情是,如果我像这样传递查询:

  var name = "test";
posts = RavenSession.Query<Post>()
.Where(x => x.Tags.Any(y => y == name))
.OrderByDescending(x => x.CreatedAt)
.Take(5);

它工作正常,如果我使用 Func<T, bool> 编写等效的 (IMO) ,它不会崩溃,但查询缺少 where 条件:

 var name = "test";     
Func<Post, bool> selector = x => x.Tags.Any(y => y == name);
posts = RavenSession.Query<Post>()
.Where(x => selector(x))
.OrderByDescending(x => x.CreatedAt)
.Take(5);

Profiler 输出如下:

query= start=0 pageSize=5 aggregation=None sort=-CreatedAt

更新:如果我使用表达式而不是 Func,它会起作用,所以我想可能是我记错了 Func 和 Linq,所以写了一个简单的测试:

var range = Enumerable.Range(1, 50);

Func<int, bool> selector = x => x == 42;
var filtered = range.Where(x => selector(x));

所以现在唯一的问题是为什么 Raven Db 查询构建器的行为不同。

最佳答案

尝试使用 Expression相反:

Expression<Func<Post, bool>> selector = x => x.Tags.Any(y => y == name);

并更改Where(x => selector(x))Where(selector) .

Expression是必需的,因为 RavenDb 可以从中构建表达式树,这允许它将逻辑转换为数据库查询。它无法从 Func<Post, bool> 构建表达式树,所以它可能会忽略它,抛出异常或 RavenDb 的创建者指定的任何内容。

关于c# - 将 ravendb 查询作为 Func<T, bool> 传递不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11190983/

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