C# 将ravendb查询作为Func传递<;T、 布尔>;不起作用
我在和RavenDb玩,想知道我是否错过了一些明显的东西 问题是,如果我像这样传递查询:C# 将ravendb查询作为Func传递<;T、 布尔>;不起作用,c#,ravendb,C#,Ravendb,我在和RavenDb玩,想知道我是否错过了一些明显的东西 问题是,如果我像这样传递查询: var name = "test"; posts = RavenSession.Query<Post>() .Where(x => x.Tags.Any(y => y == name)) .OrderByDescending(x => x.CreatedAt) .Take(5); var name=“test”;
var name = "test";
posts = RavenSession.Query<Post>()
.Where(x => x.Tags.Any(y => y == name))
.OrderByDescending(x => x.CreatedAt)
.Take(5);
var name=“test”;
posts=RavenSession.Query()
.Where(x=>x.Tags.Any(y=>y==name))
.OrderByDescending(x=>x.CreatedAt)
.采取(5);
它工作正常,如果我使用Func
编写等价(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);
var name=“test”;
Func selector=x=>x.Tags.Any(y=>y==name);
posts=RavenSession.Query()
.其中(x=>选择器(x))
.OrderByDescending(x=>x.CreatedAt)
.采取(5);
分析器的输出方式如下:
质疑=
开始=0
页面大小=5
聚合=无
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));
var范围=可枚举范围(1,50);
Func选择器=x=>x==42;
var filtered=范围,其中(x=>选择器(x));
所以现在唯一的问题是为什么Raven Db query builder的行为不同。尝试使用
表达式来代替:
Expression<Func<Post, bool>> selector = x => x.Tags.Any(y => y == name);
expressionselector=x=>x.Tags.Any(y=>y==name);
并将Where(x=>selector(x))
更改为Where(selector)
需要一个表达式
,因为RavenDb可以从中构建一个表达式树,从而将逻辑转换为数据库查询。它无法从Func
构建表达式树,因此它可能会忽略它、抛出一个exeption或RavenDb的创建者指定的任何内容 作为对您的更新的回应,在IEnumerable
上的Func
和IQueryable
上的Expression
之间存在着显著的行为差异,它们在语法上看起来是相同的。这不仅仅是Raven,还有任何IQueryable
源代码,如LINQ to SQL或Entity Framework。@Giedrius我在回答中添加了一个简短的解释。