5

我正在尝试从中提取过滤器表达式,ODataQueryOptions以便可以在我的业务逻辑类中使用它。

public PageResult<Poco> Get(ODataQueryOptions odataQueryOptions)
{
    Expression<Func<Poco, bool>> myExpression = ... // what do i do here?

    var result = _myBusinessLogic.Search(myExpression);
    return new PageResult<Poco>(result, null, null);
}

我在这里查看了描述将查询转换为 HQL 的博客,我认为(至少我希望)这对于我正在尝试做的事情来说太过分了。

我基本上需要在Expression<Func<Poco, bool>>表单中获取过滤器表达式。我试着玩,ApplyTo()但我不能完全明白。任何帮助表示赞赏。

4

1 回答 1

10

我们有一个适合您需求的 FilterBinder 类,但不幸的是它是内部的。不过,您可以做一个简单的技巧来获取 $filter 表达式,

public static class ODataQueryOptionsExtensions
{
    public static Expression ToExpression<TElement>(this FilterQueryOption filter)
    {
        IQueryable queryable = Enumerable.Empty<TElement>().AsQueryable();
        queryable = filter.ApplyTo(queryable, new ODataQuerySettings());
        return queryable.Expression;
    }
}

在你的情况下,你可以这样做,

public PageResult<Poco> Get(ODataQueryOptions odataQueryOptions)
{
    Expression<Func<Poco, bool>> myExpression = odataQueryOptions.Filter.ToExpression<Poco>();

    var result = _myBusinessLogic.Search(myExpression);
    return new PageResult<Poco>(result, null, null);
}

请注意,表达式 contains 看起来更像这样, SOTests.Customer[].Where($it => conditional-expression). 因此,您可能必须从 lambda 中提取该条件表达式。

于 2013-05-08T18:17:47.150 回答