WebAPI和OData - 返回带有前提条件的Queryable

时间:2013-03-06 22:34:59

标签: ravendb odata asp.net-web-api

我有一个简单的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]]或SourceUserId:[[EMPTY_STRING]]'开启   指数.....

这显然是错误的。

如果我正在返回List而不是IQueriable - 它工作正常,因此管道中的某些内容会更改查询。有没有人对如何使这项工作有任何见解?

1 个答案:

答案 0 :(得分:3)

首先将值复制到局部变量时它应该有效:

var userName = this.User.Identity.Name;
return session.Query<Message>()
              .Where(x => x.TargetUserId == userName ||
                          x.SourceUserId == userName);

这是因为在执行查询时,Raven Client查询转换器无法解析谓词中表示的对象。通过将它们复制到局部变量中,您将一个常量值传递给表达式。

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