2013-03-06 6 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, кстати. Проблема у меня в том, что при выполнении идентификатор пользователя заменяется на «[EMPTY_STRING]», поэтому фактический запрос его работы заключается в следующем:

«TargetUserId: [[EMPTY_STRING]] ИЛИ SourceUserId: [[ EMPTY_STRING]] 'на индекс .....

который явно не прав.

Если я возвращаю List вместо IQueriable - он работает нормально, поэтому что-то позже в конвейере меняет запрос. Кто-нибудь знает, как это сделать?

+0

Он работает, если вы сначала поместили имя в локальную переменную? –

+0

Да, да, спасибо! Немного неожиданно :) Хорошо, я понимаю, что это имеет какое-то отношение к сфере видимости? IQueriable запускается после того, как User.Identity стерта или запущена в другом потоке? – Evgeni

+0

Можете ли вы ответить на этот вопрос, чтобы я мог отметить его как таковой? – Evgeni

ответ

3

Он должен работать, когда значения копируются в локальную переменную первого:

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

Это происходит потому, что к тому времени, запрос выполняется, Ворон переводчик запрос Клиент не может разрешить объекты, выраженной в сказуемое. Скопировав их в локальную переменную, вы передаете в выражение постоянное значение.

Я считаю, это связано с закрытий. Возможно, кто-то с более прямым знанием деревьев выражений может лучше объяснить в комментариях.

Смежные вопросы