使用withParameters进行Breeze查询并展开,而不是展开

时间:2014-06-10 03:39:34

标签: breeze asp.net-web-api2 durandal-2.0

我需要在获取实体的过程中在服务器端实现一些业务逻辑,以确保用户有权检索被检索的项目。

为此,我的客户端微风查询代码改为:

var query = breeze.EntityQuery
    .from(theUrl)
    .expand("RelatedEntity")
    .where(breeze.Predicate.create("id", "==", id));

为:

var query = breeze.EntityQuery
    .from(theUrl)
    .withParameters({ id: id })
    .expand("RelatedEntity");

在服务器端,我的控制器操作已从:

更改
[HttpGet]
[BreezeQueryable]
public IQueryable<MyEntity> MyEntities()
{
    return _uow.MyEntityRepo.All();
}

类似于:

[HttpGet]
[BreezeQueryable]
public IHttpActionResult FindById(int id)
{
    var userId = HttpContext.Current.User.Identity.GetUserId();
    var hasPermission = CheckPermission(id, userId); // some implementation ...

    if (hasPermission) {
        var myEntity = _uow.MyEntityRepo.GetById(id);
        return Ok(myEntity)
    } else {
        return NotFound();
    }
}

我可以通过过滤器查看查询:

http://localhost:42789/breeze/MyEntity/FindById?$expand=RelatedEntity&id=1002

但是,RelatedEntity未定义。使用EntityQuery但不使用withParameters时,相关实体会很好地扩展并在结果集中可用。

谢谢

1 个答案:

答案 0 :(得分:1)

withParameters 调用需要引用IQueryable端点,您还需要在客户端上命名该端点。此外,如果要调用 expand ,则返回的查询必须支持EF'Include'操作。例如,如果您有像这样的服务器端方法

[HttpGet]
public IQueryable<Customer> CustomersStartingWith(string companyName) {
  return ContextProvider.Context.Customers.Where(c => c.CompanyName.StartsWith(companyName));
}

然后你可以用这样的客户端查询来查询它:

var q = EntityQuery.from("CustomersStartingWith")
        .withParameters({ companyName: "C" })
        .expand("orders");

请注意'CustomersStartingWith'作为'from'子句的参数。