如何OData的过滤器进行改造,以LINQ表达式?(How to transform OData f

2019-09-02 07:02发布

我试图从提取过滤器表达式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()但我不能完全得到它。 任何帮助表示赞赏。

Answer 1:

我们有适合您的需求,但内部可惜FilterBinder类。 但是你可以做一个简单的技巧,以获得$过滤器表达式的保持,

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);
}

注意,表达式包含看起来更像此, SOTests.Customer[].Where($it => conditional-expression) 。 所以,你可能需要提取从拉姆达是条件表达式。



文章来源: How to transform OData filter to a LINQ expression?