我需要在获取实体的过程中在服务器端实现一些业务逻辑,以确保用户有权检索被检索的项目。
为此,我的客户端微风查询代码改为:
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
时,相关实体会很好地扩展并在结果集中可用。
谢谢
答案 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'子句的参数。