13

目前,我正在调用 BreezeJs 文档/示例中显示的所有数据查询:

getEntityList = function (predicate) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  return manager.executeQuery(query);
}

但是我想在返回任何可查询的结果之前将附加参数传递给控制器​​操作:

[AcceptVerbs("GET")]
public IQueryable<Entity> EntityList(string actionParam) {
  //here goes logic that depends on actionParam
  //and returns IQueryable<Entity>
}

正如我们从文档中了解到的:

Breeze 将查询转换为 OData 查询字符串,例如:

?$filter=IsArchived%20eq%20false&$orderby=CreatedAt

这就是问题开始的地方。我应该如何构建查询以将参数传递给控制器​​操作?

getEntityList = function (predicate, actionParam) {
  var query = new entityModel.EntityQuery().from("EntityList");
  if (predicate)
    query = query.where(predicate);
  if(actionParam)
    // ???
  return manager.executeQuery(query);
}

我已经尝试将路线设置为:

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{actionParam}",
            defaults: new { query = RouteParameter.Optional }
        );

并通过在from部分中应用它来发送actionParam ,

var query = new entityModel.EntityQuery()
  .from("EntityList/" + encodeURIComponent(actionParam));

但是在某些特殊字符上编码失败,并且抛出了错误的请求。

在这种情况下如何正确发送actionParam ?请帮忙。

4

2 回答 2

24

从 v 0.76.1 开始,您可以使用 EntityQuery。withParameters方法将附加参数传递给任何服务方法。因此,您现在可以构造一个如下所示的查询,它既传递参数又使用微风的 IQueryable 支持。

EntityQuery.from("EmployeesFilteredByCountryAndBirthdate")
                 .withParameters({ BirthDate: "1/1/1960", Country: "USA" })
                 .where("LastName", "startsWith", "S")
                 .orderBy("BirthDate");

你的控制器方法看起来像这样:

[HttpGet]
public IQueryable<Employee> EmployeesFilteredByCountryAndBirthdate(DateTime birthDate, string country) {
      return ContextProvider.Context.Employees.Where(emp => emp.BirthDate >= birthDate && emp.Country == country);
}

API 文档有更多信息。

于 2012-12-10T01:46:18.360 回答
6

更新:从 BREEZE v.0.76.1 开始,这不再是正确的答案。BREEZE 现在支持查询参数。请参阅“ withParameters ”查询子句。

Breeze 添加了对参数化查询的支持,这部分归功于 SO 上的这个问题。谢谢你。

该答案用于描述不再需要的解决方法。我已经修改了我的答案,消除了我对该解决方法的描述。

于 2012-12-05T00:33:30.210 回答