【问题标题】:WebAPI and OData - returning Queryable with preconditionsWebAPI 和 OData - 返回带有先决条件的 Queryable
【发布时间】:2013-03-06 22:34:58
【问题描述】:

我有一个简单的 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 而不是 IQueriable - 它可以正常工作,因此管道中稍后会更改查询。有没有人对如何使这项工作有任何见解?

【问题讨论】:

  • 先把名字放到一个局部变量里面能行吗?
  • 是的,谢谢!有点出乎意料:) 好的,我知道这与范围有关? IQueriable 在 User.Identity 被删除后被触发,还是在不同的线程上运行?
  • 你能把这个作为答案,以便我可以这样标记它吗?
  • 已答复。我认为这是一个闭包问题,而不是线程问题。

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


【解决方案1】:

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

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

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

我相信这与闭包有关。也许对表达式树有更直接了解的人可以在 cmets 中更好地解释。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 2023-03-17
    • 2015-06-01
    • 1970-01-01
    • 2013-05-26
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多