如何在BreezeJs中正确发送动作参数和查询

Tom*_*cki 13 breeze

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

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

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

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

正如我们从文档中所知:

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

?$ FILTER =的isArchived%20当量%20false&$排序依据= CreatedAt

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

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

我已经尝试设置路线:

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

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

var query = new entityModel.EntityQuery()
  .from("EntityList/" + encodeURIComponent(actionParam));
Run Code Online (Sandbox Code Playgroud)

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

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

Jay*_*and 24

从v 0.76.1开始,您可以使用EntityQuery.withParameters方法将其他参数传递给任何服务方法.因此,您现在可以构建如下所示的查询,它们都传递参数并使用breeze的IQueryable支持.

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

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

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

API文档包含更多信息.


War*_*ard 6

更新:作为BREEZE v.0.76.1,这不是更正确的答案.BREEZE现在支持QUERIES的参数.查看" withParameters "QUERY CLAUSE.

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

这个答案用于描述不再需要的解决方法.我修改了我的答案,取消了对该变通方法的描述.