【问题标题】:Breeze query using withParameters and expand, not expanding微风查询使用 withParameters 并展开,而不是展开
【发布时间】:2014-06-11 00:55:35
【问题描述】:

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

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

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 时,相关实体会很好地展开并在结果集中可用。

谢谢

【问题讨论】:

    标签: breeze asp.net-web-api2 durandal-2.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' 子句的参数。

    【讨论】:

    • 谢谢,杰。这对我有用,但我看到的唯一缺点是我无法使用 HttpActionResult 将 404 或 401 正确地传达回客户端。不过我可以解决这个问题。
    • 实际上,您可以通过在服务器方法中抛出 HttpResponseException 来返回 401 或 404: [HttpGet] public IQueryable CustomersWithHttpError() { var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound); responseMsg.Content = new StringContent("自定义错误信息"); responseMsg.ReasonPhrase = "自定义原因";抛出新的 HttpResponseException(responseMsg); }
    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多