Wcf OData$过滤器,在$expand中包含项目

Wcf OData$过滤器,在$expand中包含项目,wcf,filter,filtering,odata,expand,Wcf,Filter,Filtering,Odata,Expand,我提供了一些web服务来访问信息 我要做的第一件事就是尝试展开一个节点。我用下面的代码成功地做到了这一点 http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings 现在,我想筛选扩展ServiceOffices时将获得的ServiceOfferingID。 如何对扩展的集合使用筛选器选项 http://www.domain.com/ODataSe

我提供了一些web服务来访问信息

我要做的第一件事就是尝试展开一个节点。我用下面的代码成功地做到了这一点

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings
现在,我想筛选扩展ServiceOffices时将获得的ServiceOfferingID。 如何对扩展的集合使用筛选器选项

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings&$filter=ServiceOfferings.ServiceOfferingID eq 127 

但它不起作用。在OData中执行相同操作的正确方法是什么?Filter命令仅适用于顶级元素。要使过滤器正常工作,您需要具有以下URL

http://www.example.com/ODataService/WorkService.svc/CaseStudies(x) /ServiceOffices?format=json&$filter=ServiceOfferingID eq 127

显然,这不是您试图编写的查询,但在幕后,您的查询将转换为一个表达式树,该表达式树具有基于顶级元素的根表达式

如果确实需要筛选数据,则可以截取查询并编写自己的表达式,如下所示:

[QueryInterceptor("CaseStudies")]
public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
{
    <Expression here>
}
[QueryInterceptor(“案例研究”)]
公共表达式CaseStudieFilter()
{
}

您也可以通过服务上的webget来实现这一点。我不得不做一些类似于按属性的属性过滤的事情。

oData支持按子对象的属性过滤

以下是一个例子:

您需要编写的查询取决于扩展集合的类型

下面是一些使用公共资源的示例

订单总是由一个客户完成

查找具有特定名称的客户的订单: . 这相当于达瓦尔的答案

客户可以发出许多订单

使用allany指定您是否希望至少一个或所有命令遵守您的条件

  • 查找特定员工已处理一个或多个订单的客户:
  • 查找长期未订购任何商品的客户:
  • 您可以调用并检查NavigationProperty元素,以查看存在哪些关系

    <NavigationProperty Name="Orders" 
        Relationship="NorthwindModel.FK_Orders_Customers" 
        ToRole="Orders" 
        FromRole="Customers"/>
    
    
    
    然后,查找与该名称的关联,您将找到基数:

    <Association Name="FK_Orders_Customers">
        <End 
             Type="NorthwindModel.Customer" 
             Role="Customers" 
             Multiplicity="0..1"/>
        <End 
             Type="NorthwindModel.Order" 
             Role="Orders" 
             Multiplicity="*"/>
        ...
    
    ,将给出:“属性'EmployeeID'的属性访问的父值不是单个值。属性访问只能应用于单个值。”

    使用all或any(如)导航多对一关系将为您提供: “任何/全部只能在集合之后使用。”


    顺便说一下,
    all()
    any()
    实际上是,∀()和,∃(),这可能是你在数学课上记得的。

    可能对某人有帮助

    GET serviceRoot/People?$expand=Trips($filter=Name eq 'Trip in US')
    

    @nil如果你读到他们实际上谈论的是在扩展上过滤的问题,这是我的answeer解决的问题,这不同于在复杂类型上过滤,因此,尽管你可能会说这不是真的,但它适用于扩展简短回答:将点改为斜线,也就是说,
    和$filter=ServiceOffices/ServiceOfferingID eq 127
    应该可以工作。你知道使用
    Simple.OData.Client
    是否可以实现这一点吗?你熟悉
    Simple.OData.Client
    ?我很好奇它是否支持过滤扩展。