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查询字符串,例如:
?$滤波器=的isArchived%20当量%20false&安培; $的OrderBy = 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);
}
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 ?请帮忙。
答案 0 :(得分: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");
你的控制器方法看起来像这样:
[HttpGet]
public IQueryable<Employee> EmployeesFilteredByCountryAndBirthdate(DateTime birthDate, string country) {
return ContextProvider.Context.Employees.Where(emp => emp.BirthDate >= birthDate && emp.Country == country);
}
API文档包含更多信息。
答案 1 :(得分:6)
更新:作为BREEZE v.0.76.1,这不再是正确的答案。 BREEZE现在支持QUERIES的参数。查看“ withParameters ”QUERY CLAUSE。
Breeze已经添加了对参数化查询的支持,部分归功于SO上的这个问题。谢谢。
此答案用于描述不再需要的解决方法。我修改了我的答案,取消了对该解决方法的描述。