微风过滤.扩展服务器端

本文关键字:服务器端 扩展 过滤 微风 | 更新日期: 2023-09-27 17:50:55

我正在尝试BreezeJS。有一个要求,我可以在客户端代码中使用.expand,但基于用户的role,服务器端不会返回.expand请求类型的所有记录。我试着创建一个自定义的BreezeQueryable属性,并覆盖一个方法来完全过滤掉额外的数据,首先只是尝试。但是它抛出了一个异常。

我看不出有什么切入点可以让我在服务器端做到这一点。

请指引我正确的方向,如果不可能的话请告诉我。我只能访问通用IQueryable,我如何对此执行查询?

下面是一些示例代码:

服务器:

[BreezeController]
[EnableCors("*", "*", "*")]
public class MyDataController : ApiController
{
    readonly EFContextProvider<MyDbContext> _contextProvider;
    public MyDataController()
    {
        _contextProvider = new EFContextProvider<MyDbContext>();
        _contextProvider.Context.Configuration.ProxyCreationEnabled = false;
        _contextProvider.Context.Configuration.LazyLoadingEnabled = false;
    }
    // GET api/<controller>
    //Trying to use a custom attribute to filter data here
    [CustomBreezeQueryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    [HttpGet]
    public IQueryable<MyData> GetAllData()
    {
        var data = _contextProvider.Context.MyData;
        return data;
    }
}
public class CustomBreezeQueryableAttribute : BreezeQueryableAttribute
{
    public override IQueryable ApplyQuery(IQueryable queryable, 
                       ODataQueryOptions queryOptions)
    {
        var data = base.ApplyQuery(queryable, queryOptions);
        //trying to filter out MyDataHistory for MyData for testing, 
        //it throws exception
        //data = data.OfType<MyDataHistory>(); 
        return data;
    }
}

客户端:

breeze.EntityQuery.from("GetAllData").expand('MyDataHistory')
                   .using(this.manager)
                   .execute()
                   .then((data) => {               
                        console.log(data.results[0]);
                        def.resolve(data.results);
                    });

这是我使用OfType时得到的exception,我想过滤,无论如何不要使用它。

{"DbOfTypeExpression requires an expression argument with a polymorphic result type that is compatible with the type argument."}

微风过滤.扩展服务器端

不完全确定我理解你的问题,但你可以通过EF 'Include'在服务器端执行'扩展',如下所示:

 [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还不支持过滤'Includes'。我还没有测试下面的例子,但是总的思路应该是可行的。

[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;
}