c# – 传递ravendb查询,因为Func不起作用
发布时间:2020-12-15 08:39:09 所属栏目:百科 来源:网络整理
导读:我正在玩RavenDb并想知道我是否遗漏了一些明显的东西. 事情是,如果我传递这样的查询: var name = "test"; posts = RavenSession.QueryPost() .Where(x = x.Tags.Any(y = y == name)) .OrderByDescending(x = x.CreatedAt) .Take(5); 它工作正常,如果我使用F
我正在玩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),它不会崩溃,但在条件: 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输出如下:
更新: var range = Enumerable.Range(1,50); Func<int,bool> selector = x => x == 42; var filtered = range.Where(x => selector(x)); 所以现在只是为什么Raven Db查询构建器的行为不同. 解决方法
请尝试使用表达式:
Expression<Func<Post,bool>> selector = x => x.Tags.Any(y => y == name); 并将Where(x => selector(x))更改为Where(选择器). 表达式是必需的,因为RavenDb可以从中构建表达式树,从而允许它将逻辑转换为数据库查询.它无法从Func< Post,bool>构建表达式树,因此它可能会忽略它,抛出一个exeption或RavenDb指定的创建者. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |