Asp.net web api 如何将OData筛选器转换为LINQ表达式?

Asp.net web api 如何将OData筛选器转换为LINQ表达式?,asp.net-web-api,odata,Asp.net Web Api,Odata,我试图从ODataQueryOptions中提取过滤器表达式,以便在我的业务逻辑类中使用它 公共页面结果获取(ODataQueryOptions ODataQueryOptions) { 表达式myExpression=…//我在这里做什么? var result=\u myBusinessLogic.Search(myExpression); 返回新的PageResult(result,null,null); } 我看了一看描述将查询转换为HQL的博客,我认为(至少我希望如此)这对我正在尝试

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

公共页面结果获取(ODataQueryOptions ODataQueryOptions)
{
表达式myExpression=…//我在这里做什么?
var result=\u myBusinessLogic.Search(myExpression);
返回新的PageResult(result,null,null);
}
我看了一看描述将查询转换为HQL的博客,我认为(至少我希望如此)这对我正在尝试的工作来说是一种过度的杀伤力


我基本上需要得到
expression
表单中的过滤器表达式。我试着玩
ApplyTo()
,但我还是不太明白。感谢您的帮助。

我们有一个FilterBinder类,适合您的需要,但不幸的是它是内部的。尽管如此,您还是可以使用一个简单的技巧来掌握$filter表达式

公共静态类ODataQueryOptions扩展
{
公共静态表达式ToExpression(此筛选器查询选项筛选器)
{
IQueryable queryable=可枚举的.Empty().AsQueryable();
queryable=filter.ApplyTo(queryable,new-ODataQuerySettings());
返回queryable.Expression;
}
}
在你的情况下,你可以

公共页面结果获取(ODataQueryOptions ODataQueryOptions)
{
表达式myExpression=odataQueryOptions.Filter.ToExpression();
var result=\u myBusinessLogic.Search(myExpression);
返回新的PageResult(result,null,null);
}
请注意,表达式包含的内容看起来更像这样,
SOTests.Customer[].Where($it=>条件表达式)
。因此,您可能需要从lambda中提取条件表达式。

谢谢,我最后做了类似的事情。看起来要从ApplyTo-casting到MethodCallExpression、提取参数和操作数等的结果中获得过滤器表达式需要做很多手术。我对这段代码的长期稳定性有点担心。我不会向应用层(api)公开上下文,我想利用ODataQueryOptions和相关类,以便能够在我自己的数据层中应用过滤器、分页、导航等。理想情况下,我希望能够提取所有表达式,然后应用于我的可查询项,将这些表达式作为参数传递给应用程序的较低层。到目前为止,我的选择是传递ODataQueryOptions,但这会将我的业务和数据层耦合到数据,这是我不想要的。你在GitHub上有没有可以帮助我的例子?建议的解决方案对我不起作用,我从
queryable.Expression
中得到了一个
MethodCallExpression
,它不能转换为
表达式
,就像例子中的那样。@KyleV.,参考转换说明。这对我来说很有魅力。TL;博士<代码>变量表达式=(表达式)((UnaryExpression)调用.参数[1])。操作数