【发布时间】:2015-12-07 13:05:21
【问题描述】:
我有一个设置,其中我有一个 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 部分正确设置它,因此客户端不必关心过滤不活动的结果。
我似乎无法弄清楚如何正确实现这一目标。有人可以帮我走上正轨吗?
【问题讨论】:
-
您可以通过急切加载来做到这一点吗? msdn.microsoft.com/en-us/data/…
-
Alexander,这可能是一个解决方案,但是,我不想每次接待客户时都获得联系人。
-
您可以尝试返回
IQueryable<Customer>吗? -
EntityFramework.DynamicFilters 是您所需要的。
-
不久前我遇到了类似的问题,wrote my own crazy bit of code to solve it。但是,链接不是一个有效的答案,所以我不能在这里发布它。
标签: c# angularjs entity-framework asp.net-web-api odata