2013-03-06 34 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); 

這是因爲當執行查詢,烏鴉客戶查詢翻譯不能解析的對象的表達謂詞。通過將它們複製到局部變量中,您將傳遞一個常量值到表達式中。

我認爲這與關閉有關。也許有更直接的表達樹知識的人可以在評論中更好地解釋。