微风过滤.扩展服务器端
本文关键字:服务器端 扩展 过滤 微风 | 更新日期: 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;
}