2013-03-06 65 views
3

我有一个简单的GET方法,它返回的IQueryable,并且对查询的一些前提条件:的WebAPI和OData的 - 返回可查询与前提

[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]]' 索引.....

这显然是错误的。

如果我正在返回List而不是IQueriable - 它工作正常,所以管道后面的内容会更改查询。有没有人有任何关于如何使这项工作的见解?

+0

如果您首先将该名称放入本地变量,它会起作用吗? – 2013-03-07 01:58:30

+0

是的,谢谢!有点意外:)好吧,我知道它与范围有关?在User.Identity被擦除后,IQueriable被触发,还是在不同的线程上运行? – Evgeni 2013-03-07 02:29:25

+0

你可以让这个答案,以便我可以标记为这样吗? – Evgeni 2013-03-07 02:29:48

回答

3

它应该工作当值复制到一个局部变量第一:

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

这是因为当执行查询,乌鸦客户查询翻译不能解析的对象的表达谓词。通过将它们复制到局部变量中,您将传递一个常量值到表达式中。

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