如何将OData过滤器转换为LINQ表达式?

bor*_*ris 5 odata asp.net-web-api

我正在尝试从中提取过滤器表达式,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);
}
Run Code Online (Sandbox Code Playgroud)

我看了看说明翻译成查询HQL的博客在这里,我认为(至少我希望如此)这是什么,我试图做一个矫枉过正.

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

Rag*_*nti 7

我们有一个适合您需求的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 建议的解决方案对我不起作用,我从 `queryable.Expression` 返回一个 `MethodCallExpression`,它不能像示例中那样转换为 `Expression&lt;Func&lt;Poco, bool&gt;&gt;`。 (3认同)