过滤OdataQueryOpeation

时间:2012-09-12 16:36:50

标签: wcf-data-services odata

我正在为RavenDB中的某些数据结构创建自定义数据服务提供程序。

我正在使用WCF数据服务工具包中的ODataContext,并且有一些查询工作像TOP / SKIP等。

public IEnumerable<Movie> GetAll(ODataQueryOperation operation)
{           
    IQueryable<Movie> query;
    if (operation.TopCount != 0)
        query = _session.Query<Movie>().Skip(operation.SkipCount).Take(operation.TopCount);
}

此代码支持以下查询:

http://<url>/oDataService.svc/Movies?$top=2

但我不能让过滤工作。

operation.FilterExpression有type-expression,它有值:it =&gt;(it.ReleaseYear == 2012)。我尝试了下面的代码,但'expression'的值变为null。

Expression<Func<Movie, bool>> expression = operation.FilterExpression as Expression<Func<Movie, bool>>;
query = _session.Query<Movie>().Where(expression);

从浏览器触发的查询如下:

http:///oDataService.svc/Movies?$ filter = ReleaseYear eq 2012

1 个答案:

答案 0 :(得分:1)

如果您想了解实际的表达式,可以尝试以下

var where = (operation.FilterExpression as UnaryExpression).Operand as Expression<Func<Movie, bool>>

这将提供一种Expression<Func<Movie,bool>>,您可以直接使用IQueryable。

query = _session.Query<Movie>().Where(where);