我有一个设置,我获得了一个 WebApi OData 服务,该服务返回:客户。返回客户的代码是:
public IHttpActionResult GetCustomers(ODataQueryOptions<Customer> queryOptions)
{
return Ok(context.Customers.Where(i => i.IsActive).AsQueryable());
}
因此,GetCustomers 方法返回所有活动客户的 IQuerable 结果。出于历史目的,我们将所有客户保留在数据库中,但当删除客户时,我们将 IsActive 字段设置为 false。
OData 设置是使用简单的 builder.EntitySet 创建实体的 Url。
EntitySetConfiguration<Customer> customers = builder.EntitySet<Customer>("customers");
这工作完美无缺。我有一个 Angular 前端,它使用 $http 调用来接收客户等。
但是,客户可以在数据库中包含相关联系人。为了获取 Angular 前端中的联系人,我使用 OData 的 $extend 功能:
odata/customers?$expand=contacts
这也很有效。我接待所有相关联系人的客户。但是,正如您所猜测的,我只想接收应返回 IsActive 的联系人。 IQueryable 功能返回所有结果。
我知道我可以使用单独的 Odata 调用来获取联系人,但我真的很想使用 $expand 功能在一次调用中获取所有数据。我知道我也可以在客户端进行过滤(使用:$filter)。但我想在 WebApi 部分中正确设置它,这样客户端就不必关心过滤掉不活动的结果。
我似乎不知道如何正确实现这一目标。有人可以帮助我走上正轨吗?