不完全确定我理解您的问题,但您可以通过 EF“包含”在服务器端执行“扩展”,如下所示:
[HttpGet]
public IQueryable<Customer> CustomersAndOrders() {
var custs = ContextProvider.Context.Customers.Include("Orders");
return custs;
}
它将返回“Customer”对象,每个对象的“Orders”属性已完全填充并加载到 Breeze 缓存中。
如果您想实际抑制服务器上给定资源名称的“扩展”,您可以使用 [BreezeQueryableAttribute]。注意AllowedQueryOptions.Expand在下面的示例中,支持的操作列表中省略了。
[HttpGet]
[BreezeQueryable(AllowedQueryOptions = AllowedQueryOptions.Filter | AllowedQueryOptions.Skip | AllowedQueryOptions.Top | AllowedQueryOptions.OrderBy)]
public IQueryable<Employee> Employees() {
return ContextProvider.Context.Employees;
}
[BreezeQueryableAttribute] 支持与此处描述的 Microsoft [QueryableAttribute] 相同的参数:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options
如果您想实际限制/过滤扩展的内容,则另一个选项只能通过自己执行过滤扩展来完成,可能需要借助通过“withParameters”传递到方法中的参数(这是因为 EF 尚不支持过滤“包括”。我还没有测试下面的示例,但总体思路应该可行。
[HttpGet]
public IQueryable<Employee> Employees(double minWeight) {
var emps = ContextProvider.Context.Employees.Include("Orders").ToList();
// remove selected orders from what gets returned to the client.
emps.ForEach(emp => {
var ordersToRemove = emp.Orders.Where(o => o.Freight < minWeight).ToList();
ordersToRemove.ForEach(o => emp.Orders.Remove(o));
});
return emps;
}