WebAPI和OData -返回带有先决条件的查询



我有一个简单的GET方法,它返回IQueryable,并且对查询有一些先决条件:

[Queryable(HandleNullPropagation = HandleNullPropagationOption.False)]
public IQueryable<Message> Get()
{
    using (var session = RavenStore.GetSession())
    {
        var messages = session.Query<Message>().Where(x => x.TargetUserId == this.User.Identity.Name || x.SourceUserId == this.User.Identity.Name);
        return messages;
    }
}
顺便说一下,这是RavenDB。我遇到的问题是,在执行时,用户id被替换为"[EMPTY_STRING]",因此实际的查询其运行是这样的:

'TargetUserId:[[EMPTY_STRING]] OR SourceUserId:[[EMPTY_STRING]]' on索引…

显然是错误的。

如果我返回List而不是iquerable -它工作得很好,所以稍后管道中的某些东西改变了查询。有谁知道怎么做吗?

首先将值复制到局部变量时,它应该可以工作:

var userName = this.User.Identity.Name;
return session.Query<Message>()
              .Where(x => x.TargetUserId == userName ||
                          x.SourceUserId == userName);
这是因为在执行查询时,Raven Client查询转换器无法解析谓词中表示的对象。通过将它们复制到局部变量中,您将常量值传递到表达式中。

我认为这与闭包有关。也许更了解表达式树的人可以在评论中更好地解释。

最新更新