Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ravendb查询作为Func传递<;T、 布尔>;不起作用_C#_Ravendb - Fatal编程技术网

C# 将ravendb查询作为Func传递<;T、 布尔>;不起作用

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”;

我在和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”;
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我在回答中添加了一个简短的解释。