3

IQueryableを返す単純なGETメソッドがあり、クエリにいくつかの前提条件があります。

[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]]' onindex....。

これは明らかに間違っています。

IQueriableではなくListを返す場合、正常に機能するため、パイプラインの後半でクエリが変更されます。誰かがこれを機能させる方法について何か洞察を持っていますか?

4

1 に答える 1

3

値が最初にローカル変数にコピーされるときに機能するはずです。

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

これは、クエリが実行されるまでに、Ravenクライアントクエリトランスレータが述語で表現されたオブジェクトを解決できないためです。それらをローカル変数にコピーすることにより、式に定数値を渡します。

これは閉鎖に関連していると思います。おそらく、式ツリーについてより直接的な知識を持っている人は、コメントでよりよく説明することができます。

于 2013-03-07T02:44:17.230 に答える